![](/img/trans.png)
[英]Accessing a virtual member function of a template argument derived class in C++
[英]Template function argument in derived class
我想知道为什么下面的代码不能用gcc(4.6.3)编译,而使用cl可以正常工作。 我显然可以通过删除DoSomething
函数的template参数使用gcc对其进行编译。 尽管如此,我想了解为什么以下语法不正确。
感谢您的任何提示。
template <class T>
class Base {
public:
template <class B>
struct Var1 {
B var1_var;
};
Base() {};
~Base() {};
template <class V> void DoSomething(V val) {
std::cout << val.var1_var << std::endl;
}
};
template <class T>
class Derived : public Base<T> {
public:
Derived() {};
~Derived() {};
void Test() {
typename Base<T>::template Var1<int> val;
val.var1_var = 5;
Base<T>::DoSomething<typename Base<T>::template Var1<int> >(val); //error: expected ‘(’ before ‘>’ token
}
};
int main(int, char**) {
Derived<double> bla;
bla.Test();
return 0;
}
问题在于Test
是一个nondependant name
dependant
nondependant name
(不涉及T
),因此编译器在查找函数Dosomething
时不会在dependant
基类中查找。 您可以像以前一样解决此问题(使用0x499602D2的答案),但是它将不允许虚拟分派机制。 您也可以仅使用this->DoSomething(val)
解决此问题,这将启用虚拟调度。
更多信息在这里 。
您需要另一个template
:
Base<T>::template DoSomething<typename Base<T>::template Var1<int> >(val);
// ^^^^^^^^
更新:您也不需要提供template参数。 您可以允许模板参数推导为您完成:
DoSomething(val);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.