错误 C2666:"std::fpos<_Mbstatet>::运算符 +":2 个重载具有类似的转换
error C2666: 'std::fpos<_Mbstatet>::operator +' : 2 overloads have similar conversions
我在下面的代码片段中得到了上面的错误,我修复了这个错误。但我不确定修复方法,如果修复不好,你能告诉我吗。谢谢你抽出时间!
代码段:
// 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::streamsize
和std::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++标准库实现定义的有符号整数类型,并且足够大,可以满足最大可能的文件大小。
相关文章:
- 构造函数和转换运算符之间的重载解析
- 如何在C++中正确重载运算符转换字符*?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- C++:从重载函数转换为 std::function
- 为什么选择转换运算符的重载?
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- C++ 函数重载不明确,没有自动类型转换
- C++ 运算符重载转换
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- unordered_set使用重载运算符=设置转换
- C++:使用重载而不是动态强制转换通过基选择派生类
- 具有重载类型转换运算符的函数对象崩溃
- 类型转换运算符重载与 as 非成员函数
- 模板化转换运算符的重载解析
- 将强制转换运算符重载到 std::map 的正确语法是什么
- C++ 重载转换运算符黑客
- g++和clang++-删除由重载转换运算符歧义获取的指针
- 重载转换函数模板
- 如何将模板化函数重载转换为部分专门化的模板化类静态方法