calling template function of template base class
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Where and why do I have to put the “template” and “typename” keywords?
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | template<typename T> class base { public: virtual ~base(); template<typename F> void foo() { std::cout <<"base::foo<F>()" << std::endl; } }; template<typename T> class derived : public base<T> { public: void bar() { this->foo<int>(); // Compile error } }; |
当运行时:
1 2 | derived<bool> d; d.bar(); |
我得到以下错误:
1 2 | error: expected primary-expression before ‘int’ error: expected ‘;’ before ‘int’ |
我知道非依赖名称和两阶段查找。但是,当函数本身是一个模板函数(我的代码中的
1 | this->template foo<int>(); |
如果你想要所有血淋淋的细节,请看这个问题。
你应该这样做:
1 2 3 4 5 6 7 8 9 | template<typename T> class derived : public base<T> { public: void bar() { base<T>::template foo<int>(); } }; |
下面是完整的可编译示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> template<typename T> class base { public: virtual ~base(){} template<typename F> void foo() { std::cout <<"base::foo<F>()" << std::endl; } }; template<typename T> class derived : public base<T> { public: void bar() { base<T>::template foo<int>(); // Compile error } }; int main() { derived< int > a; a.bar(); } |