【问题标题】:Weird template constructor syntax奇怪的模板构造函数语法
【发布时间】:2011-12-24 04:28:23
【问题描述】:

有什么区别

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

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

它们似乎都工作相同并且可以编译。

编辑

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

【问题讨论】:

  • 它们是一样的。 whywhy&lt;T&gt; 的同义词
  • 嗯,第二个是......你知道,就像你说的那样奇怪。我也想知道。那么为什么有 呢?如果是同义词有什么意义?

标签: c++ templates constructor


【解决方案1】:

它们是等价的。在前者中,why 是一个 injected 名称,它被定义为与 why&lt;T&gt; 相同(其中 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&lt;T&gt;:: 之后我们在类的范围内,而foo 被定义为foo&lt;T&gt;。所以正确的做法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多