在通用编程中使用关键字模板进行规范

时间:2013-08-29 16:11:47

标签: c++ templates

#include <iostream>

namespace oo{

  class A{
  public:
    template<typename T>
    static T get_value(){return static_cast<T>(55);}
  };

  template <typename T=A>
  class B{
    public:
    static double f(){return T::get_value<double>();}
  };

}

int main(int argc, char *argv[])
{
  using std::cout;
  using std::endl;

  cout << oo::B<oo::A>::f() << endl;

  return 0;
}

考虑到这里的示例,它会编译错误“不允许类型名称”,它引用“double”和“get_value()”中的参数。

有人通过重写函数f()来纠正这个错误:

static double f(){return T::template get_value<double>(); }

然而,我不太明白这里使用“模板”。有人可以向我解释一下吗?

提前感谢您的意见。

2 个答案:

答案 0 :(得分:0)

这是在运行时发生的事情。

namespace oo{

  class A{  
  public:
   // template<typename T>  // T replaced with <double> type.
    static double get_value(){return static_cast<double>(55);}
  };

  //template <typename T=A> // T replaced with <oo::A> type.
  class B{
    public:
    static double f(){return oo::A::get_value/*<double>*/();}
  };

}

int main(int argc, char *argv[])
{
  using std::cout;
  using std::endl;

  cout << oo::B::f() << endl;

  return 0;
}

这一行:     static double f(){return T :: get_value();} 是正确的,通常会编译没有任何错误(取决于你正在使用的巫婆编译器),因为模板声明将对下一个范围有效。

template <class T>
class foo
{
   //T will be valid in this scope.
};

实现模板类/函数不是这种情况,您通常希望在需要防止使用多次重载的情况下执行此操作。

答案 1 :(得分:0)

原因是编译器如何解释该行,当您使用模板时,语法有多种可能的解释,请看下面的内容:

static double f()
{
    return T::get_value < double > ();
}

在你的函数中,你现在如何传递给B类的T参数有一个名为get_value的函数或一个名为get_value的数据成员?如果案例是第二个,那么你使用运算符lees - 而不是在该成员和double之间,然后在double和()之间。那么编译器的第一个假设是这些选项,如果你想告诉他这是一个带模板的函数(为了正确解释“&lt;”)你需要把关键字模板