[英]Need help regarding Template class instantiation
让我用一个例子来说明我的问题:
template <typename T> class a{
public:
T data;
a():data(T()){}
a(T temp): data(temp) {}
};
所以如果写在main()
之类的
a(30);
a("String");
所以根据模板参数推导规则,应该可以生成第一个临时的class as a<int>(30)
等
但我的错误是:
'(' 标记之前缺少模板 arguments
那么为什么会发生这种情况,这仅适用于 function 模板?
arguments 的模板参数推导仅适用于函数,不适用于类。 在您知道 class 的类型,即它的所有模板参数之前,您甚至不知道 class 有哪些成员函数!
所以,如果你想直接构造一个 object,你总是要说模板参数:
a<int> x(30);
这里有一个小思想实验来扩展上述内容。 假设我们有
template <typename T> class Foo;
我们正在调用Foo::somefunction(x);
,其中x
是某种类型。 你认为,好吧,我声明somefunction()
是这样的:
template <typename T> class Foo
{
static void somefunction(const T & x);
};
所以很明显T
与x
的类型相同。 但现在想象一下我有一个专业:
template <> class Foo<char>
{
static void anotherfunction(double x);
};
class Foo<char>
甚至没有function somefunction()
,所以表达式Foo::somefunction(x)
甚至没有达到我可以查找参数的阶段!
解决这个问题的常用方法是创建一个免费的助手 function 来构建您的 object:
template <typename T> a<T> make_a(const T & x) { return a<T>(x); }
由于这是一个function模板,所以可以推导出它的参数:
make_a(30); // type a<int>
make_a("hello"); // type a<char[6]>
构造函数不是模板,它的 class 是模板。 所以当你写a(30)
时,不能对 class 模板进行模板参数推导!
如果存在构造函数模板,则编译器可以推导出模板化构造函数的模板参数。 例如这里:
template <typename T> class A{
public:
template<typename U>
A(const U &): {} //note : it's a constructor template
};
A<char> obj(30); //U is deduced as int
在上面的例子中,只能推导出U
,你仍然需要提供T
。 这是因为
您仍然需要将临时声明为例如a<int>(30)
。
您不能将 class 模板 arguments 从 arguments 推断到构造函数 - 不幸的是。
模板类型推导只发生在模板函数上。 您需要为模板 class 实例化指定参数。 您可以使用 function 模板来推导模板参数并返回适当的类型。 在 c++0 x 中,您可以使用 auto 来保存实例。 无法在我的手机上轻松为您编写示例代码!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.