所以我有这段代码并且出于方便,我希望它的构造函数的默认参数是int类和0。(我的项目类中有更多参数,其中一个是可选的,我不喜欢我想两次编写构造函数,因为它很大)
class mama{
public:
template<typename x> mama(x i=int(0)){}
};
int main(){
mama x;
}
这不起作用,因为它说找不到构造函数,所以有另外一种方法可以做到这一点吗?
error: no matching function for call to ‘mama::mama()'
note: candidates are: mama::mama(const mama&)
答案 0 :(得分:3)
将构造函数重构为私有初始化函数和包装器构造函数,然后添加默认值,如下所示:
class mama {
private:
template<typename x> void init(x i) { /* ... */ }
public:
template<typename x> mama(x i) { init(i); }
mama() { init((int)0); }
};
答案 1 :(得分:3)
请注意,功能模板不允许使用默认模板参数。为什么不创建一个类模板?
template <class T=int>
class mama{
public:
mama<T>(T i=0){}
};
int main(){
mama<> x; // no argument based template parameter deduction possible
}
答案 2 :(得分:-1)
默认值就像重载一样,所以......
class mama{
public:
template<typename x> mama(x i){}
mama(int i = 0) {}
};
当您创建没有参数的mama时,具有默认int的构造在任何模板化构造函数之前匹配。