重载模板类的赋值运算符

时间:2013-04-28 19:04:42

标签: c++ templates operator-overloading

我正在尝试为两个不同的模板类重载赋值运算符,但使用相同的模板类型:

template <class DataType> class Foo
{
    public: Foo<data_type>& operator=(Bar<data_type> const &bar);
};
template <class DataType> class Bar
{
    public: Bar<data_type>& operator=(Foo<data_type> const &foo);
};

然而,当我尝试:

Foo<int> a;
Bar<int> b = a;

我收到错误:

  

没有可行的转换'Foo&lt; int&gt;'到'Bar&lt; int&gt;'。

我如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

转换是通过复制构造函数完成的,而不是赋值运算符。所以你想实现:

Bar(const Foo<data_type>& foo);

答案 1 :(得分:1)

当你写:

Bar<int> b = a; // ERROR! No viable user-defined conversion sequence

您正在从对象b 复制初始化对象a。尽管使用了a符号, 对象b分配给已构建的对象=相同

通过复制初始化,编译器必须查找用户定义的转换序列,该序列可以将a转换为Bar<int>类型的对象,b最终可以从中复制 - 构建或移动构造。

另一方面,分配可以起作用:

Foo<int> a;
Bar<int> b;
b = a; // OK