奇怪的模板构造函数语法

时间:2011-12-24 04:28:23

标签: c++ templates constructor

之间有什么区别
template <class T>
class why
{
public:
   why()
   {}
};

template <class T>
class why
{
public:
   why<T>()
   {}
};

他们似乎都工作相同并且编译。

修改

而且,如果它们真的相同,为什么即使在C ++语言中这个功能呢?

1 个答案:

答案 0 :(得分:3)

他们是等同的。在前者中,why注入的名称,其定义与why<T>相同(其中T是实际的模板参数。)这是为了方便打字。


请注意,此注入是在类的范围内,而不是在它之外。很明显,但是给出了:

template <typename T>
struct foo
{
    foo x(foo f);
};

一个常见的错误可能是尝试定义x,如下所示:

template <typename T>
foo foo<T>::x(foo f) { return f; }

但这将是一个错误,因为返回类型中的foo需要模板参数。但是,参数列表中的foo是可以的,因为在foo<T>::之后我们在类的范围内,而foo被定义为foo<T>。因此,正确的方法是:

template <typename T>
foo<T> foo<T>::x(foo f) { return f; }

template <typename T>
foo<T> foo<T>::x(foo<T> f) { return f; } // equivalent