转换运算符(赋值运算符=)没有响应

时间:2016-06-30 06:09:09

标签: c++ operator-overloading copy-constructor

我一直在尝试测试对赋值运算符的调用=对于我的结构:

struct array{

    void* data;

    template<typename S, typename T>
    array& operator= (const map<S, T>& that){ cout << "worked...";  return *this;}

   private:
     array();           //i don't need this
};

我试驾这样:

map<int, string> var;
array arr = var;

我收到了一个错误:

Error: conversion from
'std::map<int, string, std::less<int>, std::allocator<std::pair<const int, string> > >'
to non-scalar type 'array' requested*/ 

问题: 究竟是什么问题?如何重载这样的运算符?我的意思是 operator=,它应该将不同类型的对象转换为它自己的类类型。

1 个答案:

答案 0 :(得分:5)

声明

map<int, string> var;
array arr = var;

...不会调用复制赋值运算符。

它使用(或表现得好像使用)复制构造函数:在声明中=表示复制初始化。

如果该类有其他构造函数,则会考虑将var转换为array实例,然后(除非将此部分进行优化)将其传递给复制构造函数。 / p>

但是你只有默认的复制构造函数。

从B类到A类的转换最好用以下两种方式之一表示:

  • 通过接受B。

  • 的A类构造函数
  • 如果B是一个班级,则通过B operator A(转化运算符)。

在其他新闻中:

  • void*是一种丢弃类型信息的方法。丢弃类型信息是一种制造麻烦的方法。因此,void*最好是无效的。