错误 C2679 二进制“<<”: 未找到接受 'T' 类型右手操作数的运算符

Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'T'

我尝试编译以下代码:

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。

根本原因是什么,如何解决。有什么想法吗?

糟糕,其中一个电话是 'class enum'。当然,>>和<<都没有为它定义。

对于@cdhowie,这里有两个简单的示例(在 load_and_save_data 模板方法的帮助下):

这里mMembers是一个std::unorderedmap(参考上面问题中的save_and_load_data,我也有一个标准容器):

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 的核心只在 load_save_data 中编写一次,优点是简单,并有相应的加载和保存代码(类型,顺序...)。

当然,也有缺点,但我希望你会明白,有些人认为也有(恕我直言)优点可能是有道理的。

剩下的就是个人喜好了。