为什么调用模板成员函数会出错?

时间:2011-10-24 05:34:55

标签: c++ templates compiler-errors

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’

1 个答案:

答案 0 :(得分:4)

因为t的类型为Test<Real>,其中Real是模板参数,所以t的类型实际上是一个依赖类型。您需要使用以下命令让编译器知道to是模板函数:

_i = t.template to<int>();

否则,您可能会尝试在名为operator<的{​​{1}}成员上使用t(导致一些错误),这是编译器假定的,除非您将其标记为{{1 }}。从to调用时,template的类型为main,它不依赖于任何模板参数,因此编译器可以自己计算模板函数。