【发布时间】:2014-07-01 00:32:56
【问题描述】:
我一直在学习 C++ 模板,但遇到了一些奇怪的行为。考虑这个类结构(从我的原始代码中删除):
class A {
public:
std::vector <int> vec;
};
template <typename T> class B : public A { };
template <typename T> class C : public B<T> {
public:
using A::vec;
int test() {
return vec[1]; // OK
}
int test2() {
return vec.size(); // error: 'class A' has no member named 'size'
}
};
编译时,test2 出现错误,说class A 没有成员size。但是vec 应该是vector 对象,而不是A 的实例。事实上,如果我直接从A 而不是B<T> 派生C,或者从C 中删除模板,它编译得很好。
此外,如果我将以下方法添加到C:
int test3() {
void ***v = vec; // error: cannot convert from
// 'std::vector<int,...>' to 'void***'
}
编译器说它不能从vector<int> 转换为void***,所以它似乎知道vec 的正确类型。我在这里犯了一个错误,或者这可能是我的编译器中的一个错误?我正在使用 Apple 版本的 g++ 4.2.1。编辑:似乎也出现在 g++ 的更高版本中。
感谢您的帮助!
第二次编辑:如果我在test2 中使用this->vec.size() 而不是依赖using A::vec 声明,我的编译器会很高兴。
【问题讨论】:
标签: c++ templates inheritance g++