Ошибка C2679 двоичный '<<': не найден оператор, который принимает правый операнд типа 'T' - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь скомпилировать следующий код:

class CFileOperations
{
    ...
    template <typename T>
    inline void load_and_save_data(std::fstream* stream, T& value, const EOperation operation)
    {
        switch (operation) {
            case EOperation::OpSave:
                *stream << value;     <-- here
                break;
            case EOperation::OpLoad:
                *stream >> value;     <-- and here
                break;
        }
    }
    ...
};

Я получаю следующие ошибки:

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion)
Error   C2679   binary '>>': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion)

Например, я использую его таким образом, где number является int ':

this->load_and_save_data(stream, number, operation);

Я использую Visual C ++ 2019.

В чем причина root и как ее решить. Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Моя ошибка, один из вызовов был с "перечислением классов". Конечно, >> и << для него не определены. </p>

0 голосов
/ 15 июня 2020

Для @ cdhow ie вот два примера результирующей простоты (с помощью методов шаблона load_and_save_data):

Здесь mMembers - это std :: unorderedmap (см. Save_and_load_data в вопросе выше , У меня также есть один для контейнеров starndard):

void CHexArea::load_and_save()
{
    this->load_and_save_data((char&)mColor);
    this->load_and_save_data(mTouchLeft);
    this->load_and_save_data(mTouchRight);
    this->load_and_save_data(mTouchBottom);
    this->load_and_save_data(mTouchTop);

    this->load_and_save_data(mMembers);
}

Здесь в настройках есть две версии файлов:

void CHexPreferences::load_and_save()
{
   if( this->is_loading() ) {
      this->reset(); // version's forward compatibility
   }

   int version = 2;
   this->load_and_save_data(version);
   this->load_and_save_data(mBoardOrientation);
   this->load_and_save_data(mBoardSize);
   this->load_and_save_data(mComputerStarts);
   this->load_and_save_data(mComputerInitialTurns);
   if( version >= 2) {
      this->load_and_save_data(mComputerTilesPerTurn);
   }
   this->load_and_save_data(mDebugFlags);
}

Простой и понятный.

Конечно, есть два метода ( load () и save () ), которые являются внешним интерфейсом и вызывают те, что указаны выше, но: 1. Они являются частью библиотеки. (не нужно их переписывать, ОО как обычно) и 2. Ядро загрузки / сохранения записывается только один раз в load_save_data, с преимуществом простоты и с соответствующим кодом загрузки и сохранения (типы, порядок ...).

Конечно, есть минусы, но я надеюсь, вы увидите, что некоторым людям может быть разумно думать, что есть (ИМХО, очень сильные) плюсы.

Остальное это дело вкуса.

...