模板类的显式初始化
explicit initializtion of template class
本文关键字:初始化 更新时间:2023-10-16
我有一个模板类,其中包含两个带有以下构造函数的模板参数:
template <class T, class TCompare>
class MyClass {
...
public:
MyClass(TCompare compare);
...
};
我有一个结构,它重载运算符 () 进行整数比较:
struct IntegerLess {
bool operator () {const int& a, const int& b) {
if (a < b)
return true;
return false;
}
};
我想将此结构作为参数传递给 MyClass 构造函数。我尝试了以下方法:
MyClass<int> myClassObject(IntegerLess());
和
MyClass<int, typename IntegerLess> myClassObject(IntegerLess());
但是,两次我都有编译时错误。在第一种情况下
error: wrong number of template arguments (1, should be 2)
在第二种情况下
error: template argument 2 is invalid
有人可以指出这里的正确选择是什么吗?谢谢!
数字 1 是错误的,因为无法推断类模板参数 - 您必须显式指定它们(除非它们在类模板定义中具有默认值)。
数字 2 只是有一个不应该存在的额外typename
。正确的语法是:
MyClass<int, IntegerLess> myClassObject(IntegerLess());
如果IntegerLess
是您的实际代码,而不是您为简化问题而制作的模拟,请考虑改用std::less<int>
,它完全符合您的类的作用。您甚至可以将其作为类的默认模板参数,如下所示:
模板>类 我的类{公共: 显式 MyClass(TCompare compare = TCompare()); //...其余的和以前一样};
如果这样做,您将能够以简化的形式使用它:
MyClass<int> myClassObject;
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员