一个类可以没有参数的模板化构造函数吗?

时间:2014-10-24 22:11:28

标签: c++ templates

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

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

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

- 罗恩

2 个答案:

答案 0 :(得分:3)

您无法将模板参数显式传递给构造函数模板。建设者没有名字。

  

[注意:因为显式模板参数列表遵循   函数模板名称,因为转换成员函数   模板和构造函数成员函数模板不带调用   使用函数名称,无法提供显式模板   这些函数模板的参数列表。 - 结束记录]

虽然您可以使用语法foo<int>::foo来命名构造函数,但它只能以不受任何兴趣的方式使用:

  

在查找中,构造函数是可接受的查找结果   并且嵌套名称说明符指定一个类C
- 如果名称   嵌套名称说明符之后指定的,在C中查找时,是   注入类名为C(第9条),或者 - [...]
而是名称   考虑命名类C的构造函数。 [...] 这样的构造函数名称   只能在名称为a的声明的 declarator-id 中使用   构造函数或 using-declaration

答案 1 :(得分:1)

在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编译,没有警告。

更新:此解决方案有误。评论中对此进行了解释。我认为这是一个有用的坏解决方案,我想保留在这里。请不要downvote,因为那样我将不得不删除它。我希望这会奏效。干杯!