gpt4 book ai didi

c++ - 从类模板访问继承的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:10 25 4
gpt4 key购买 nike

我一直在学习 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没有成员(member)size .但是vec应该是 vector对象,不是 A 的实例.事实上,如果我得出 C直接来自 A而不是 B<T> ,或从 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++ 中。

感谢您的帮助!

第二次编辑:如果我使用 this->vec.size(),我的编译器会很高兴在 test2而不是依赖 using A::vec声明。

最佳答案

首先,您的代码使用 clang 进行编译(参见 here ),而不使用 gcc 进行编译。 .我还用 VS2013 编译它。


您的原始问题与编译器如何在模板中查找名称有关。

标准 § 14.6.2:

Non-dependent names used in a template definition are found using the usual name lookup and bound at the point they are used.

还有 C++ FAQ有一个很好的条目:

The compiler does not look in dependent base classes (like B) when looking up nondependent names (like vec).


解决方案:

1.使用this->vec (这在模板中总是隐式依赖)

int test2() {
return this->vec.size();
}

2.使用using B<T>::vec

3.使用B<T>直接:

int test2() {
return B<T>::vec.size();
}

注意事项:

  • 我不确定为什么 gcc 拒绝 using A::vec; ,在我看来像是一个编译器错误(请注意 using B<T>::A::vec; 有效)。
  • 模板名称查找的标准引用:§ 14.6.3 和 § 14.6.4

关于c++ - 从类模板访问继承的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com