0
#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>(); }

然而,我不太明白这里“模板”的使用。谁能给我解释一下,好吗?

提前感谢您的评论。

4

2 回答 2

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.
};

这不是实现模板类/函数的情况,您通常希望在要防止使用多个重载的情况下这样做。

于 2013-08-29T17:34:11.413 回答
0

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

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

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

于 2013-08-29T17:39:06.983 回答