派生模板-對基類成員的類訪問-數據這個問題是本文所提問題的進一步。這條線.使用以下類定義:template <class T>class Foo {public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
}
void BarFunc ();};template <class T>void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl; // This doesn't work - compiler error is: error: ‘_foo_arg’ was not declared in this scope
std::cout << Bar<T>::_foo_arg << std::endl; // This works!}在訪問模板類的基類成員時,似乎必須始終使用模板樣式語法對成員進行顯式限定。Bar<T>::_foo_arg..有辦法避免這種情況嗎?“使用”語句/指令能否在模板類方法中發揮作用以簡化代碼?編輯:通過使用以下->語法對變量進行限定來解決范圍問題。
3 回答
米脂
TA貢獻1836條經驗 獲得超3個贊
BarFunc
#include <iostream>class streamable {};std::ostream &operator<<(std::ostream &os, streamable &s) { return os; }class foo_arg_t :
public streamable {};class a_arg_t : public streamable {};class b_arg_t : public streamable {};template <class T>class Foo {public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
}
void BarFunc ();};template <class T>void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl;
std::cout << Bar<T>::_foo_arg << std::endl; }int main(){
Bar<a_arg_t> *b = new Bar<a_arg_t>(foo_arg_t(), a_arg_t());
b->BarFunc();}
炎炎設計
TA貢獻1808條經驗 獲得超4個贊
_foo_arg
_foo_arg
// solution#1std::cout << this->_foo_arg << std::endl;
// solution#2std::cout << Foo<T>::_foo_arg << std::endl;
using:
// solution#3template <class T>class Bar : public Foo<T> {public:
...
void BarFunc ();private:
using Foo<T>::_foo_arg;};template <class T>void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl; // works}- 3 回答
- 0 關注
- 535 瀏覽
添加回答
舉報
0/150
提交
取消
