【问题标题】:conversion operator (assignment operator=) is not responding转换运算符(赋值运算符 =)没有响应
【发布时间】:2016-11-02 01:55:09
【问题描述】:

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

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=,它应该将不同类型的对象转换为自己的类类型。

【问题讨论】:

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


【解决方案1】:

声明

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

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

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

如果该类有其他构造函数,他们会考虑将var 转换为array 实例,然后(除非这部分被优化掉)传递给复制构造函数。

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


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

  • 通过接受 B 的 A 类构造函数。

  • 如果 B 是类,则通过 B operator A(转换运算符)。


在其他新闻中:

  • void* 是一种丢弃类型信息的方法。丢弃类型信息是制造麻烦的一种方式。所以,void* 最好不要使用。

【讨论】:

  • 很好地表达了@Cheers 和hth。 - 阿尔夫。谢谢(你的)信息。也许我应该重新考虑一下。
  • 对不起,我不得不处理一些垃圾(他们大约在这个时候收集它)所以我忘记添加以完成复制初始化的部分。现在解决这个问题。
  • 非常感谢。这是为什么我的Var x = 1.0; 不适用于赋值重载的唯一解释!只有Var x; x = 1.0; 有效!现在有意义
  • 添加到这里见learncpp.com/cpp-tutorial/…The assignment operator (operator=) is used to copy values from one object to another already existing object.
猜你喜欢
  • 2020-12-16
  • 2011-11-16
  • 2013-11-30
  • 2015-10-02
  • 2013-06-28
  • 1970-01-01
  • 2015-02-25
  • 2015-12-14
  • 2011-08-02
相关资源
最近更新 更多