派生类中的模板函数参数

Template function argument in derived class

本文关键字:函数 参数 派生      更新时间:2023-10-16

我想知道为什么下面的代码不能与gcc(4.6.3)编译,而使用cl则可以很好地工作。显然,我可以通过删除DoSomething函数的模板参数来用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;
}

问题是Testnondependant name(它不涉及T),所以编译器在寻找函数Dosomething时不会在dependant基类中查找。您可以像以前那样解决这个问题(使用0x499602D2的答案),但是它不允许虚拟分派机制。您也可以通过使用this->DoSomething(val)来解决这个问题,这将启用虚拟调度。

更多信息请点击

你需要另一个template:

Base<T>::template DoSomething<typename Base<T>::template Var1<int> >(val);
//       ^^^^^^^^

更新:您也不需要提供模板参数。你可以允许模板参数演绎为你做这件事:

DoSomething(val);