对重载函数find_first_not_of的模糊调用

巨型狐狸

错误C2668:'std :: basic_string <wchar_t,std :: char_traits <wchar_t>,std :: allocator&lt:wchar_t >> :: find_first_not_of':对重载函数的歧义调用

我在Visual Studio 2013中收到此错误,但在MinGW中却没有。我该怎么办?

我尝试添加cache.std::wstring::find_first_not_of,但这没有帮助。

我的代码:

wstring cache = key.GetExpandStringValue(L"Path");
int empregnul = 0;
if(cache.find_first_not_of('\0') == wstring::npos)
{
    empregnul = 1;
}
核桃

我认为,至少从C ++ 14开始,通过拒绝您的代码,MSVC不符合标准。您使用的版本早于C ++ 14,因此显然不支持该版本,但是更高版本的MSVC版本仍然会产生相同的歧义错误,即使给出/std:c++14or/std:c++latest/permissive-flag,请参见hhttps://godbolt.org/z / fQA4YD。但也请注意此答案末尾有关最新版本的MSVC的评论。

MSVC似乎认为'\0'可以将其转换为空指针值,因为它是一个空指针常量

这将使过载find_first_not_ofwchar_t作为参数,过载以const wchar_t*作为参数,同样精彩的比赛。

您可以看到,这是MSVC造成歧义的原因,方法是将字符值更改为除零以外的任何值,例如'a',在这种情况下,MSVC认为调用是明确的。

但是,在将CWG第903号决议作为缺陷报告解决后,C ++ 14标准(最终草案)[conv.ptr] / 1中的相关段落说:

空指针常数是整数字面([lex.icon])与零值或类型的std的prvalue :: nullptr_t。

'\0'字符文字,不是整数文字因此,它不是一个空指针常量,因此不能将其转换为指针,从而使调用变得明确。

在CWG问题903之前,整数类型和值为零的任何右值常量表达式都是空指针常量,因此在这种情况下,MSVC是正确的以给出歧义。但这并不能解释在较新版本和C ++ 14(或更高版本)标志中的行为。

这可以通过使用L'\0'代替来解决'\0',因为它L'\0'具有type wchar_t,因此它与预期的重载wchar_t 完全匹配,而预期的重载const wchar_t*将需要转换(假设甚至允许转换),从而使前者更好地匹配并解决了歧义。

即使没有错误(尽管在此特定情况下也没有关系),上述修复仍然是您应该采取的措施。您不想与混char在一起wchar_t使用wchar_t/时,请wstring始终L在字符文字和字符串文字之前添加,以为其指定正确的类型。


正如@RaymondChen在此问题下的评论中指出的那样,给出标志,较新版本的MSVC(在godbolt上不可用)确实实现了CWG 903的分辨率/permissive-,请参阅将整数常量表达式隐式转换为null指针

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 11 auto,std :: function和对重载函数的模糊调用

来自分类Dev

对重载整数构造函数的歧义调用

来自分类Dev

模板编程:对重载函数的歧义调用

来自分类Dev

错误:对重载函数的模棱两可的调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

为什么对重载函数的调用不明确?

来自分类Dev

如何解决“ fpclassify”:对重载函数的歧义调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

C ++ find_first_not_of

来自分类Dev

对带有函数参数的重载函数进行模糊歧义调用

来自分类Dev

可变参数模板函数中对重载函数的歧义调用

来自分类Dev

VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

使用float会导致“对重载函数的调用不明确”错误

来自分类Dev

'sqrt':对重载函数.. \ assimp \ vector3.inl的歧义调用

来自分类Dev

在VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

当我添加头文件“ boost / function”时,使用“ bind”对重载函数进行歧义调用

来自分类Dev

错误C2668:'boost :: bind':对重载函数的模棱两可的调用

来自分类Dev

错误:无法解析对重载函数的引用

来自分类Dev

C#函数对重载方法的引用

来自分类Dev

MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

来自分类Dev

调用重载的构造函数

来自分类Dev

函数重载和调用

来自分类Dev

C++ 使用 find_first_not_of(char*) 删除向量元素

来自分类Dev

如何使用 strspn 模仿 std::string 的 find_first_not_of

来自分类Dev

C ++中的模糊函数调用

来自分类Dev

对 Collection 扩展函数的模糊调用

来自分类Dev

nodeJS中的重载函数调用

来自分类Dev

递归调用重载的C ++函数

来自分类Dev

分解出重载的函数调用

Related 相关文章

  1. 1

    C ++ 11 auto,std :: function和对重载函数的模糊调用

  2. 2

    对重载整数构造函数的歧义调用

  3. 3

    模板编程:对重载函数的歧义调用

  4. 4

    错误:对重载函数的模棱两可的调用

  5. 5

    C ++模板和对重载函数的歧义调用

  6. 6

    为什么对重载函数的调用不明确?

  7. 7

    如何解决“ fpclassify”:对重载函数的歧义调用

  8. 8

    C ++模板和对重载函数的歧义调用

  9. 9

    C ++ find_first_not_of

  10. 10

    对带有函数参数的重载函数进行模糊歧义调用

  11. 11

    可变参数模板函数中对重载函数的歧义调用

  12. 12

    VS2013中使用可变参数模板时“对重载函数的歧义调用”

  13. 13

    使用float会导致“对重载函数的调用不明确”错误

  14. 14

    'sqrt':对重载函数.. \ assimp \ vector3.inl的歧义调用

  15. 15

    在VS2013中使用可变参数模板时“对重载函数的歧义调用”

  16. 16

    当我添加头文件“ boost / function”时,使用“ bind”对重载函数进行歧义调用

  17. 17

    错误C2668:'boost :: bind':对重载函数的模棱两可的调用

  18. 18

    错误:无法解析对重载函数的引用

  19. 19

    C#函数对重载方法的引用

  20. 20

    MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

  21. 21

    调用重载的构造函数

  22. 22

    函数重载和调用

  23. 23

    C++ 使用 find_first_not_of(char*) 删除向量元素

  24. 24

    如何使用 strspn 模仿 std::string 的 find_first_not_of

  25. 25

    C ++中的模糊函数调用

  26. 26

    对 Collection 扩展函数的模糊调用

  27. 27

    nodeJS中的重载函数调用

  28. 28

    递归调用重载的C ++函数

  29. 29

    分解出重载的函数调用

热门标签

归档