【发布时间】:2014-10-24 22:11:28
【问题描述】:
我希望有一个看起来像这样的课程:
template <typename T>
class foo
{
public:
template <typename S>
foo()
{
//...
}
};
但我不知道如何调用构造函数。显然,我可以通过给 foo() 一个类型为 S 的参数来完成这项工作,但它可以在没有任何参数的情况下完成吗?
--罗恩
【问题讨论】:
我希望有一个看起来像这样的课程:
template <typename T>
class foo
{
public:
template <typename S>
foo()
{
//...
}
};
但我不知道如何调用构造函数。显然,我可以通过给 foo() 一个类型为 S 的参数来完成这项工作,但它可以在没有任何参数的情况下完成吗?
--罗恩
【问题讨论】:
您不能将模板参数显式传递给构造函数模板。构造函数没有名字(我们不要进入文字游戏)。然而,这并不意味着你不能完成你想要完成的任何事情。您可以通过类模板参数传入S,或者在构造函数中获取标签函数参数以推导出S。或者改为促进工厂功能。
【讨论】:
这对我在 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中对此进行了解释。我认为这是一个有用的糟糕解决方案,我想保留它。
【讨论】:
A<float>::A<int> 等价于 A<int>。使用std::is_same 进行检查。 ;)
A<float>::A 视为 injected-class-name 用作 template-name 来解析 A<float> a(A<float>::A<int>());,从而使 @987654330 @ 完全等同于 A<int> 并且整个语句是一个函数声明(由于最麻烦的解析)。例如 - melpon.org/wandbox/permlink/m0rQjY45u0vGUs9t.