2011-12-17 27 views
1

VS2010で次のコードをコンパイルしようとしたときにエラーC2678が表示されました。map <string、string> in class

#include <string> 
#include <map> 
using namespace std; 
class test 
{ 
    private: 
     map<string, string> data; 
    public: 
     test(){}; 
     ~test(){}; 
    public: 
     const string & get(const string & key)const{return data[key];}; //error C2678 
     bool set(const string & key, const string & value){data[key]=value;return true;}; 
}; 
void main() 
{ 
    const string key="Hello world!"; 
    const string value="I'm coming!"; 
    test t; 
    t.set(key,value); 
    t.get(key); 
} 

しかし、私はそれをコンパイルして実行しない

#include <string> 
#include <map> 
using namespace std; 
bool set(const string & key, const string & value, map<string, string> & data) 
{ 
    data[key]=value; 
    return true; 
} 
const string & get(const string & key, map<string, string> & data) 
{ 
    return data[key]; 
} 
void main() 
{ 
    const string key="Hello world!"; 
    const string value="I'm coming!"; 
    map<string, string> data; 
    set(key, value, data); 
    get(key; 
} 

のような関数としてそれを残します。

誰が問題について知っていますか?

+0

今後、番号だけでなくエラーテキストも貼り付けてください。 –

答えて

6

テストクラスのgetメンバ関数をconstとして宣言しました。しかし、std::mapoperator[]は非const関数なので、const関数から呼び出すことはできません。代わりにfind関数を使用してください。

理由がoperator[]でないのは、キーが存在しない場合は、デフォルトの構成値とともにマップに挿入されるためです。 constマップ内のオブジェクトを検索するに

+0

私はそれを変更していませんか? –

+1

@ Y.Z。 :問題は 'operator []'が見つからない場合にキーを挿入することです。だからあなたがそれに割り当てをしなくても、それはまだ変化を引き起こすかもしれません。 –

+1

@ Y.Z:渡されたキーがまだ存在しない場合、マップは自動的にデフォルトでキーと値のペアを作成し、それをツリーに追加します。 – Xeo

3

、あなたがoperator[]を使用することはできません、findメンバ関数を使用する必要があります。

const string & get(const string & key)const {return data.find(key)->second;} 

(注)このキーが常に存在すると仮定していること。

+0

右。 data.at()も機能します。 –

+0

マップに「at」メソッドがあるとは思わない。 –

+0

C++ 0xにあります。 –

関連する問題