我的情况如下:
Class Bar {
...
}
template <class T>
class Foo {
public:
...
Foo(Foo<Bar> bar) {
...
}
...
}
因此,类Foo的一个构造函数可以使用由Bar参数化的类Foo元素。这一切都很好,直到我实例化由Bar参数化的类Foo,其中此构造函数被解释为复制构造函数,这不是我想要的。我想知道如何在不干扰复制构造函数的情况下使用构造函数来获取这样的元素。例如,我可以这样做:
template <class T>
class Foo {
public:
...
Foo(Foo<Bar> bar, int unused) {
...
}
...
}
它工作正常,因为现在构造函数不会与复制构造函数冲突。有没有一种标准的方法来处理这个问题?
答案 0 :(得分:3)
如果您的类模板不需要声明复制构造函数(在一般情况下),您可以将构造函数声明为
Foo(Foo<Bar> const& bar);
一般是转换构造函数,Foo<Bar>
是复制构造函数。其他专业化将在适用的情况下使用隐式声明的复制构造函数。
否则,使构造函数成为模板可确保它不是特殊成员。话虽如此,必须注意该构造函数不要干扰复制构造函数。这不好,但你可以这样做:
template<typename U>
Foo(U bar, typename boost::enable_if<boost::is_same<U, Foo<Bar> > >::type* = 0);
这是一个不是复制构造函数的构造函数,只有在传递Foo<Bar>
类型的参数时才会使用它。请注意,由于重载决策的规则,Foo<Bar>
的复制构造函数将优先于此构造函数。
前面是C ++ 03。这是一个简单的C ++ 11解决方案:
template<int = 0>
Foo(Foo<Bar>);
答案 1 :(得分:0)
这实际上不是有效的复制构造函数,因为复制构造函数应遵循以下四种格式之一:
MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );
为了让一切按预期工作,将参数作为指针传递:
Foo(Foo<Bar>* bar) {
// Logic
}
如果你按值传递它,如果你的逻辑模仿了一个复制构造函数,你就可以很好地创建一个无限循环。