我希望有一个看起来像这样的课程:
template <typename T>
class foo
{
public:
template <typename S>
foo()
{
//...
}
};
但我无法弄清楚如何调用构造函数。显然,我可以通过给foo()一个S类型的参数来完成这项工作,但它可以在没有任何参数的情况下完成吗?
- 罗恩
答案 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,因为那样我将不得不删除它。我希望这会奏效。干杯!