2016-06-30 11 views
1

応答していません。変換演算子(代入演算子=)私は、構造体のために=代入演算子の呼び出しをテストしようとしてきた

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

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 
}; 

と私はこのようなテストは、運転しました

私はエラーを受け取っ:

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。コピー代入演算子は呼び出されません。

コピーコンストラクタを使用(使用しているかのように動作)します。宣言では、=はコピー初期化を示します。

クラスが他のコンストラクタを持っていた場合、vararrayインスタンスに変換すると考えられていましたが、(この部分が最適化されていない限り)コピーコンストラクタに渡されます。

しかし、あなたはデフォルトのコピーコンストラクタしか持っていません。最高の2つの方法のいずれかで表されるクラスA型のタイプBから


変換:クラス介し

  • B場合B.

  • を受け付けるコンストラクタB operator A(変換演算子)を介してクラスです。他のニュースで


  • void*は、型情報を破棄するための方法です。型情報を破棄することは、問題を作り出す方法です。だから、void*が一番良いです。
+0

@Cheersとhthがよく表現されています。 - Alf。情報をありがとう。多分私は考え直すべきです。 –

+0

申し訳ありませんが、私はコピーの初期化の部分を完了するために追加することを忘れてしまったので、ごみを処理しなければなりませんでした。それを今修正する。 –

関連する問題