对重载函数find_first_not_of的不明确调用
ambiguous call to overloaded function find_first_not_of
错误 C2668: 'std::basic_string<wchar_t,std::char_traits>
,std::分配器<: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(' ') == wstring::npos)
{
empregnul = 1;
}
我认为 MSVC 拒绝您的代码不符合标准,至少从 C++14 开始。您正在使用早于 C++14 的版本,因此显然不支持它,但更高版本的 MSVC 版本仍然会产生相同的歧义错误,即使/std:c++14
或/std:c++latest
并给出/permissive-
标志,请参阅 hhttps://godbolt.org/z/fQA4YD。但也要注意本回答末尾关于最新版本的 MSVC 的评论。
MSVC 似乎认为' '
可以转换为空指针值,因为它是空指针常量。
这将使find_first_not_of
将wchar_t
作为参数的重载和将const wchar_t*
作为参数的重载同样是很好的匹配。
您可以看到这是 MSVC 通过将字符值更改为零以外的任何内容来解释歧义的原因,例如'a'
,在这种情况下,MSVC认为调用是明确的。
但是,在 CWG 第 903 期作为缺陷报告得到解决后,C++14 标准(最终草案(和更高标准 [conv.ptr]/1 中的相关段落说:
空指针常量是值为零或 std::nullptr_t 类型的 prvalue 的整数文本 ([lex.icon](。
' '
是字符文本,而不是整数文本。因此,它不是空指针常量,不能转换为指针,从而使调用明确。
在解决 CWG 问题 903 之前,任何整数类型和值零的右值常量表达式都是空指针常量,因此在这种情况下,MSVC 给出歧义是正确的。但这并不能解释较新版本和 C++14(或更高版本(标志中的行为。
这可以通过使用L' '
而不是' '
来解决,因为L' '
具有类型wchar_t
,因此它与期望wchar_t
的重载完全匹配,而期望const wchar_t*
的重载需要转换(假设甚至允许转换(,使前者成为更好的匹配并解决歧义。
上面提到的修复也是您应该做的,即使没有错误(尽管在这种特定情况下无关紧要(。您不想将char
与wchar_t
混为一谈。使用wchar_t
/wstring
时,请始终在字符文本和字符串文本前面添加L
,以赋予它们正确的类型。
正如@RaymondChen在此问题下的评论中指出的那样,较新版本的 MSVC(在 godbolt 上不可用(在给出/permissive-
标志时确实实现了 CWG 903 的决议,请参阅将整数常量表达式隐式转换为空指针。
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- gcc出现不明确的模板实例化错误
- 调用'Node'构造函数是不明确的
- 如何解决不明确的运算符过载问题?
- 使用 nullptr 调用重载方法是不明确的
- "fpclassify":对重载函数的不明确调用
- 对"列表"的引用不明确,包括头文件
- 删除全局隐式函数 - 避免使用不明确的运算符
- 当接收到不明确的规范时,表示图的邻接列表的数据结构
- "byte":使用Crypto++和Windows SDK时出现不明确的符号错误
- 使用 std::iterator_traits<> 时编译时错误不明确
- 不明确的函数模板
- Vulkan中的描述符集计数不明确