错误 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 中编写一次,优点是简单,并有相应的加载和保存代码(类型,顺序...)。
当然,也有缺点,但我希望你会明白,有些人认为也有(恕我直言)优点可能是有道理的。
剩下的就是个人喜好了。
我尝试编译以下代码:
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 中编写一次,优点是简单,并有相应的加载和保存代码(类型,顺序...)。
当然,也有缺点,但我希望你会明白,有些人认为也有(恕我直言)优点可能是有道理的。
剩下的就是个人喜好了。