模板类型的显式初始化
C++ / Template / Explicit init of template type?
假设以下虚拟模板:
template < class DataType > class Dummy
{
public:
void init( )
{
m_data = DataType( 0 );
}
private:
DataType m_data;
};
调用init将初始化内部数据。当DataType是标准数据类型(例如int或float)时,这确实工作得很好。当DataType是一个类时,该类必须有相应的构造函数。
现在假设DataType是一个由合适的类表示的复数。在这种情况下,给Complex number类一个只有一个参数的构造函数是没有意义的,因为在正常情况下,您需要初始化实部和虚部。
我的问题是:在考虑模板应该适合存储任何数据类型的情况下,初始化模板类型的最佳泛型方法是什么?
我认为例如STL必须实现这样的想法,但我在代码中迷失了。
我想你的意思是:
DataType( 0 );
:
Data ( 0 );
无论如何,尝试:
m_data = DataType();
将为类类型调用默认构造函数,或者为内置类型调用零初始化。
您可以使用默认参数:
template <class T>
class A
{
public:
void init(T c = T()) //default argument
{
m_data = c;
}
private:
T m_data;
};
如果模板参数类型T
是用户自定义的类型,并且它没有定义默认的构造函数,那么你必须自己传递一个参数给init()
函数,否则会导致编译错误。
这是标准库所采用的方法。例如,std::vector::resize()
接受一个可选参数,其原理与上面提到的相同。
实际上,您在这里考虑的是"默认可构造"类,也就是说,可以在没有特定于类的输入的情况下进行初始化的类。STL在编写时考虑到了这一术语,并且正如@DanielEarwicker所写,内置类型的默认构造函数定义为零初始化。
因此,要获得这样的功能,您的复数类必须支持默认构造函数,即没有参数的构造函数。
相关文章:
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 零初始化类型
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 类型值不能用于初始化类型实体
- 无效初始化类型的 BinaryNode *& 的非常量引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 直接或通过构造函数初始化类型的类
- 无法使用 'Shape *' 类型的左值初始化类型 'Shape Shape::*' 的返回对象
- C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
- 从类型为"矩阵"的右值初始化类型为"矩阵"的非常量引用无效
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- C 我可以用双重初始化类型浮点的变量
- 无法识别初始化类型