2
我有一个结构定义如下:模板碰撞
struct A : public B, public C
{
A(const B& b) : B(b), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
int main()
{
B b;
A sample1(b);
A sample2(3); // For example, B has a B(int) constructor.
}
而且这不正常工作,因为,A(b)
尝试使用第二构造(非恒定的基准是优选的选项,并第一个构造函数是一个常量引用),但B
还没有任何B(A&)
。
而且,我想补充一个move
构造方法B:
struct A : public B, public C
{
A(const B& b) : B(b), C()
{}
A(B&& b) : B(std::move(b)), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
现在,最后一步是融合前两个构造函数:
struct A : public B, public C
{
template<typename fw_B>
A(fw_B&& b) : B(std::forward<fw_B>(b)), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
问:如果第一个版本导致碰撞,最后的版本(我的最终目的)明确表示它也不起作用。我怎么能实现这个目标?
您的代码中存在一个错误。 'A(b);'相当于'A b;',所以它不*传递'b'给任何构造函数。 –
对不起,你说得对,我写了这个代码“到位”。非常感谢 :) –