错误 C2666:"std::fpos<_Mbstatet>::运算符 +":2 个重载具有类似的转换

error C2666: 'std::fpos<_Mbstatet>::operator +' : 2 overloads have similar conversions

本文关键字:重载 转换 gt fpos std C2666 lt 运算符 错误 Mbstatet      更新时间:2023-10-16

我在下面的代码片段中得到了上面的错误,我修复了这个错误。但我不确定修复方法,如果修复不好,你能告诉我吗。谢谢你抽出时间!

代码段:

// get length
//long length = strlen( statement)+5; 
std::streamoff length = strlen(statement) + 5; // Fix for the error
// ckeck length and stream size against max buffer size
if( (m_sqlStream.tellp()+length)>=BATCH_WRITER_BUFFER_SIZE) //c2666

输出:

error C2666: 'std::fpos<_Mbstatet>::operator +' : 2 overloads have similar conversions
C:Program Files (x86)Microsoft Visual Studio 12.0VCincludeiosfwd(88): could be 'std::fpos<_Mbstatet> std::fpos<_Mbstatet>::operator +(std::streamoff) const'
C:Program Files (x86)Microsoft Visual Studio 12.0VCincludecomutil.h(174): or       '_bstr_t operator +(const wchar_t *,const _bstr_t &)'
C:Program Files (x86)Microsoft Visual Studio 12.0VCincludecomutil.h(173): or       '_bstr_t operator +(const char *,const _bstr_t &)'
while trying to match the argument list '(std::fpos<_Mbstatet>, long)'

我认为这是对的。std::streamsizestd::streamoff需要是积分类型的typedef,并且它们可以转换为积分类型或从积分类型转换为积分型。编译器抱怨,因为它无法确定运算符+的哪个重载是合适的,因为参数可以通过多种方式隐式转换。例如:

void f(int, double);
void f(double, int);
int main() {
    f(3, 4);   // C2666! 3 or 4 can be converted to a int or a double, compiler can't resolve this ambiguity.
} 

您可以通过显式地铸造一个或多个实际参数来澄清它:

if ((long)m_sqlStream.tellp() + length) >= BATCH_WRITER_BUFFER_SIZE)

或者做你已经做过的事
请注意,在从std::streamoff转换为long时,编译器可能会警告您可能会丢失数据,这是因为std::streamoff是由C++标准库实现定义的有符号整数类型,并且足够大,可以满足最大可能的文件大小。