派生类中的模板函数参数

时间:2014-08-01 15:00:02

标签: c++ templates gcc

我想知道为什么下面的代码不能用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;
}

2 个答案:

答案 0 :(得分:3)

问题是Testnondependant name(它不涉及T)所以编译器在查找函数时不会查找dependant基类Dosomething。 你可以解决这个问题(使用0x499602D2的答案),但它不允许虚拟调度机制。您只需使用this->DoSomething(val)即可解决此问题,这将启用虚拟调度。

更多信息here

答案 1 :(得分:2)

您需要另一个template

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

更新:您也不需要提供模板参数。您可以允许模板参数推断为您执行此操作:

DoSomething(val);