2016-06-30 27 views
1

我一直在试图进行测试,以赋值运算符的呼叫=为我的结构:转换操作符(赋值运算符=)没有响应

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

请不要将C++代码块标记为Javascript代码片段 - 它们确实无法在浏览器中运行... –

+0

可能的重复[为什么在这种情况下调用操作符未被调用以支持复制构造函数?](http://stackoverflow.com/questions/14637805/why-is-the-assignment-operator-not-called-in-this-case-in-favor-of-the-copy-cons) – TobiMcNamobi

回答

4

声明

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

&hellip;不会调用复制赋值操作符。

它使用(或表现为仿佛使用)复制构造函数:声明=表示复制初始化。

如果这个类有其他构造函数,他们会考虑将var转换为array实例,那么会将其传递给拷贝构造函数(除非将这部分优化掉)。

但是你只有默认的拷贝构造函数。

  • 经由一类,它接受一个B.

  • 如果B A构造:从B到一个类类型A型


    转化最好在两种方法之一表示是一个类,通过B operator A(转换运算符)。


其他消息:

  • void*是丢弃类型信息的方式。丢弃类型信息是创建问题的一种方式。所以,void*是最好的无效。
+0

清晰明了@Cheers和hth。 - Alf。谢谢(你的)信息。也许我应该重新思考。 –

+0

对不起,我不得不处理一些垃圾(他们收集这个时间),所以我忘了添加来完成复制初始化的一部分。现在解决这个问题。 –