Old*_*der 22 c++ inheritance templates
当模板公开继承自另一个模板时,不是应该可访问的基本公共方法吗?
template <int a>
class Test {
public:
Test() {}
int MyMethod1() { return a; }
};
template <int b>
class Another : public Test<b>
{
public:
Another() {}
void MyMethod2() {
MyMethod1();
}
};
int main()
{
Another<5> a;
a.MyMethod1();
a.MyMethod2();
}
Run Code Online (Sandbox Code Playgroud)
好吧,海湾合作委员会对此嗤之以鼻......我必须遗漏一些完全明显的东西(大脑融化).救命?
Lea*_*elo 31
这是有关从属名称的规则的一部分.Method1不是范围内的依赖名称Method2.所以编译器不会在依赖的基类中查找它.
有两种方法可以解决这个问题:使用this或指定基本类型.关于这篇最近的帖子或C++ FAQ的更多细节.另请注意,您错过了public关键字和分号.这是您的代码的固定版本.
template <int a>
class Test {
public:
Test() {}
int MyMethod1() { return a; }
};
template <int b>
class Another : public Test<b>
{
public:
Another() {}
void MyMethod2() {
Test<b>::MyMethod1();
}
};
int main()
{
Another<5> a;
a.MyMethod1();
a.MyMethod2();
}
Run Code Online (Sandbox Code Playgroud)
Kir*_*sky 14
你应该完全符合资格MyMethod1.C++标准在14.6.2/3中清楚地说明了这一点:
在类模板的定义或类模板的成员中,如果类模板的基类依赖于模板参数,则在类的定义时,在非限定名称查找期间不会检查基类作用域.模板或成员或在类模板或成员的实例化期间.
所以,你应该写:
void MyMethod2() {
Test<b>::MyMethod1();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15087 次 |
| 最近记录: |