template <class T>
class Test{
public:
Test(T){ }
template <class U>
U to() const{ return U(0); }
};
template <class Real>
class Base{
typedef Test<Real> TST;
protected:
Base(const TST& t){
_i = t.to<int>(); // <- but this gives error
}
int _i;
};
template <class Real, class T> class Child;
template <class Real>
class Child<Real, int> : public Base<Real>{
typedef Base<Real> F;
typedef Test<Real> TST;
public:
Child() : F(TST(23.0)){ }
};
int main(int argc, char* argv[]){
Child<double, int> rw;
Test<double> t1(3.3);
int i = t1.to<int>(); // <- this works
return 0;
}
在主要作品中调用to
,但我无法弄清楚为什么在Base()
中调用它时不会。我得到的错误是:
t1.cpp: In constructor ‘Base<Real>::Base(const TST&)’:
t1.cpp:20:15: error: expected primary-expression before ‘int’
t1.cpp:20:15: error: expected ‘;’ before ‘int’
答案 0 :(得分:4)
因为t
的类型为Test<Real>
,其中Real
是模板参数,所以t
的类型实际上是一个依赖类型。您需要使用以下命令让编译器知道to
是模板函数:
_i = t.template to<int>();
否则,您可能会尝试在名为operator<
的{{1}}成员上使用t
(导致一些错误),这是编译器假定的,除非您将其标记为{{1 }}。从to
调用时,template
的类型为main
,它不依赖于任何模板参数,因此编译器可以自己计算模板函数。