需要关于模板类实例化的帮助
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");
因此,根据模板参数推导规则,它应该能够生成第一个临时类a<int>(30)
等
但是我的错误是:
在'('令牌
之前缺少模板参数
那么为什么会发生这种情况,这只适用于函数模板?
从实参中推导模板形参只适用于函数,不适用于类。除非你知道类的类型,也就是它所有的模板形参,否则你甚至不知道这个类有哪些成员函数!
所以,如果你想直接构造一个对象,你总是需要说出模板参数:
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);
};
类Foo<char>
甚至没有有函数somefunction()
,所以表达式Foo::somefunction(x)
甚至没有到我可以查找参数的阶段!
template <typename T> a<T> make_a(const T & x) { return a<T>(x); }
由于这是一个函数模板,它的形参可以推导:
make_a(30); // type a<int>
make_a("hello"); // type a<char[6]>
构造函数不是模板,而是类本身是模板。因此,当您编写a(30)
时,不能为类模板推导模板参数 !
如果存在构造函数模板,则编译器可以推导出模板化构造函数的模板实参。例如:
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是类模板的模板参数。模板参数推导不能在这里进行。
您仍然需要将临时声明为,例如a<int>(30)
。
你不能从构造函数的参数中推断出类模板的参数——很遗憾。
模板类型推断只发生在模板函数中。您需要为模板类实例化指定参数。您可以使用函数模板来推断模板参数并返回适当的类型。在c++ x中,你可以使用auto来保存实例。不能在我的手机上为您轻松编写示例代码!
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 帮助错误 C2259:无法实例化抽象类
- 需要帮助清理模板实例化框架
- 需要帮助理解luabind如何实例化类
- 需要关于模板类实例化的帮助