C ++ повысить lexical_cast с шаблоном? - PullRequest
1 голос
/ 18 июня 2011

Я пытаюсь создать класс, который хранит настройки программы в виде 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

При форсировании вывод ошибки очень длинный, и я не совсем уверен, что с ним не так.

Ответы [ 3 ]

3 голосов
/ 18 июня 2011

CString не имеет оператора << Попробуйте использовать std :: string </p>

2 голосов
/ 18 июня 2011

Как показано в документации , boost :: lexical_cast выполняет свое преобразование на основе наличия нескольких вещей.Тип источника должен иметь оператор <<, который принимает std :: ostream (или std :: wostream), а тип назначения должен иметь оператор >>, который принимает std :: istream (или std :: wistream).Первый параметр этих функций является неконстантной ссылкой на поток, а второй параметр является ссылкой на тип для отправки / конструирования.

Чтобы преобразовать имя параметра в T, этот Tдолжен иметь оператор >>, который принимает входной поток.Аналогично, для преобразования в CString должен существовать оператор <<, который принимает выходной поток. </p>

2 голосов
/ 18 июня 2011

бинарный '>>': не найден оператор, который принимает левый операнд типа 'std :: basic_istream <_Elem, _Traits>'

lexical_cast в основном пытается записатьобъект в объект потока.

вам нужен оператор << </strong> и >> , определенный для записи в поток в классе, который вы используете для его работы.(зависит от того, читаешь ты или пишешь)

...