2016-06-30 38 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

對不起,我不得不處理一些垃圾(他們收集這個時間),所以我忘了添加來完成複製初始化的一部分。現在解決這個問題。 –