【发布时间】:2011-10-18 13:25:40
【问题描述】:
为什么有些编译器坚持要求模板基类的合格成员公共成员,而不要求非模板类相同?请看以下代码清单:
模板类:
#include <iostream>
using namespace std;
template <class T>
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
size_t vval_;
TestImpl(size_t val = 0) : vval_(val) { }
};
template <class T>
class Test : public TestImpl<T> {
public:
Test(size_t val) : TestImpl<T>(val) {
cout << "vval_ : " << vval_ << endl; // Error: vval_ was not declared in this scope
//! cout << "vval_ : " << TestImpl<T>::vval_ << endl; // this works, obviously
}
};
int main() {
Test<int> test1(7);
return 0;
}
非模板类:
#include <iostream>
using namespace std;
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
TestImpl(size_t val = 0) : vval_(val) {}
size_t vval_;
};
class Test : public TestImpl {
public:
Test(size_t val) : TestImpl(val) {
cout << "vval_ : " << vval_ << endl;
}
};
int main() {
Test test1(7);
return 0;
}
上述代码清单之间的显着区别在于,第一个清单使用模板类,而第二个不使用。
现在,两个列表都可以使用 Microsoft 的 Visual Studio 编译器 (cl) 编译,但第一个列表 WONT 可以同时使用 Digital Mars 编译器 (dmc) 和 Minimalist GNU for Windows (MinGW - g++) 编译器。我会收到类似“vval_ was not declared in the scope”之类的错误——我显然明白这是什么意思。
如果我有资格使用 TestImpl
关于这两个编译器和可能的其他编译器,我的问题是为什么我应该能够直接从继承自的 非模板类直接访问(不限定)vval_ 变量一个非模板类,而我不能从从模板类继承的模板类做同样的事情?
【问题讨论】:
-
您也可以限定
vval_,因此:this->vval_。 -
@Rob: this->vval_ 在派生类中工作。当使用“以一种方式实现”的继承时,您的实现的重要部分在基本 claas 中,感觉必须在每个地方都这样做很笨拙。谢谢
-
@visitor: 揭示阅读
-
@JohnGathogo:如果标识符依赖于类型参数,但该依赖关系在代码中不明确,您将需要明确声明该依赖关系,
this->将开始看起来不那么糟糕...
标签: c++ oop inheritance