繁体   English   中英

需要有关模板 class 实例化的帮助

[英]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);
};

所以很明显Tx的类型相同。 但现在想象一下我有一个专业:

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 这是因为

  • U 是构造函数模板的模板参数。 在这种情况下可以进行模板参数推导。
  • T 是 class 模板的模板参数。 此处不能进行模板参数推导。

您仍然需要将临时声明为例如a<int>(30)

您不能将 class 模板 arguments 从 arguments 推断到构造函数 - 不幸的是。

模板类型推导只发生在模板函数上。 您需要为模板 class 实例化指定参数。 您可以使用 function 模板来推导模板参数并返回适当的类型。 在 c++0 x 中,您可以使用 auto 来保存实例。 无法在我的手机上轻松为您编写示例代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM