【问题标题】:Can a class have a templated constructor without arguments? [duplicate]一个类可以有一个没有参数的模板构造函数吗? [复制]
【发布时间】:2014-10-24 22:11:28
【问题描述】:

我希望有一个看起来像这样的课程:

template <typename T>
class foo
{
  public:
    template <typename S>
    foo()
    {
      //...
    }
};

但我不知道如何调用构造函数。显然,我可以通过给 foo() 一个类型为 S 的参数来完成这项工作,但它可以在没有任何参数的情况下完成吗?

--罗恩

【问题讨论】:

标签: c++ templates


【解决方案1】:

您不能将模板参数显式传递给构造函数模板。构造函数没有名字(我们不要进入文字游戏)。然而,这并不意味着你不能完成你想要完成的任何事情。您可以通过类模板参数传入S,或者在构造函数中获取标签函数参数以推导出S。或者改为促进工厂功能。

【讨论】:

  • “你不能给一个构造函数模板五个模板参数”:假。请参阅可以使用一对迭代器初始化的向量的构造函数。请参阅(4)en.cppreference.com/w/cpp/container/vector/vector
  • 您不能将模板参数显式传递给构造函数模板。构造函数可以模板化,但必须推断所有模板参数。
  • @BenVoigt 看看我的回答。
  • @Notinlist:你的答案不是 C++。
  • 我只想说构造函数确实有名字,并且不允许在没有括号参数的情况下调用模板化构造函数是愚蠢的。事实上,让我创造我不能使用的东西是愚蠢的。 Cpp团队需要纠正他们的许多荒谬之处。
【解决方案2】:

这对我在 gcc 4.4.5 (Debian 4.4.5-3) 上有效

template<typename T>
class A
{
public:
    template<typename U>
    A()
        : t(U())
    { }
private:
    T t;
};

int main()
{
    using namespace std;
    A<float> a(A<float>::A<int>());
    return 0;
}

使用g++ -W -Wall -Wextra -pedantic tc.cpp -o tc 编译,没有警告。

更新:这个解决方案是错误的。 cmets中对此进行了解释。我认为这是一个有用的糟糕解决方案,我想保留它。

【讨论】:

  • 实际上你在做什么shouldn't even compile... 听起来像一个错误的 g++。
  • 大声笑。 A&lt;float&gt;::A&lt;int&gt; 等价于 A&lt;int&gt;。使用std::is_same 进行检查。 ;)
  • 一个显式的参数列表跟在模板的名字后面,但是“构造函数没有名字。”.
  • 直接引用标准,第 14.8.1 节:“[注意:因为显式模板参数列表遵循函数模板名称,并且因为调用转换成员函数模板和构造函数成员函数模板时不使用一个函数名,没有办法为这些函数模板提供一个显式的模板参数列表。——结束注释]"
  • 在 clang 中编译,而不是在 4.4 之后的 g++ 版本中编译。无论如何,编译此代码的所有编译器都会通过将 A&lt;float&gt;::A 视为 injected-class-name 用作 template-name 来解析 A&lt;float&gt; a(A&lt;float&gt;::A&lt;int&gt;());,从而使 @987654330 @ 完全等同于 A&lt;int&gt; 并且整个语句是一个函数声明(由于最麻烦的解析)。例如 - melpon.org/wandbox/permlink/m0rQjY45u0vGUs9t.
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2015-06-17
  • 2015-08-04
  • 1970-01-01
  • 2018-05-13
相关资源
最近更新 更多