2

プログラム設定をstd::mapとして保存するクラスを作成しようとしています。すべてのプログラム設定は文字列として保存されるので、関連するタイプにキャストされたプログラム設定を返すことができるアクセサメソッドが欲しいです。私はC++でテンプレートを作成するのは初めてで、これが私の最初の試みです。

class Settings
{
public:
    Settings(void);
    virtual ~Settings(void);

    enum SettingName {HomePageUrl, WindowWidth};

    template<class T>
    T Get(SettingName name)
    {
        return boost::lexical_cast<T>(settings_[name]);
    }

    template<class T>
    void Set(SettingName name, T value)
    {
        settings_[name] = boost::lexical_cast<CString>(value);
    }

private:
    std::map<SettingName, CString> settings_;

};  

ただし、コンパイラエラーが発生します。

...boost\boost_1_46_1\boost\lexical_cast.hpp(776): error C2678: binary '>>' :
no operator found which takes a left-hand operand of type
'std::basic_istream<_Elem,_Traits>' (or there is no acceptable conversion)

..settings.h(33) : see reference to function template instantiation
'Target boost::lexical_cast<CString,T>(const Source &)' being compiled

ブーストを使用すると、エラー出力が非常に長くなり、何が問題になっているのかよくわかりません。

4

3 に答える 3

4

CString には operator<< がありません std::string の使用を検討してください

于 2011-06-17T21:07:34.603 に答える
3

バイナリ '>>' : タイプ 'std::basic_istream<_Elem,_Traits>' の左側のオペランドを取る演算子が見つかりません

lexical_cast は基本的に、オブジェクトをストリーム オブジェクトに書き込もうとします。

使用しているクラスのストリームに書き込むために定義された<<および>>演算子が必要です。(読むか書くかによって異なります)

于 2011-06-17T21:18:29.173 に答える
3

ドキュメントに示されているように、boost::lexical_cast はいくつかの存在に基づいて変換を行います。ソースの型には、std::ostream (または std::wostream) を受け取る operator<< が必要であり、宛先の型には、std::istream (または std::wistream) を受け取る operator>> が必要です。これらの関数の最初のパラメーターはストリームへの非 const 参照であり、2 番目のパラメーターは送信/構築する型への参照です。

設定名を T に変換するには、その T に、入力ストリームを受け取る operator>> が必要です。同様に、CString に変換するには、出力ストリームを受け取る operator<< が必要です。

于 2011-06-17T21:28:19.360 に答える