gpt4 book ai didi

c++ - 重载 wstring 和 wchar_t 时的类似转换 *

转载 作者:行者123 更新时间:2023-11-30 00:58:49 29 4
gpt4 key购买 nike

我有以下代码:

inline bool match(const std::wstring & text1, const std::wstring & text2)
{
return match(text1.c_str(), text2.c_str());
}

inline bool match(const std::wstring & text1, const wchar_t * text2)
{
return match(text1.c_str(), text2);
}

inline bool match(const wchar_t * text1, const std::wstring & text2)
{
return match(text1, text2.c_str());
}

inline bool match(const wchar_t * text1, const wchar_t * text2)
{
return !wcscmp(text1, text2);
}

我得到:

error C2666: 'match' : 3 overloads have similar conversions
1> could be 'bool match(const wchar_t *,const std::wstring &)'
1> or 'bool match(const std::wstring &,const wchar_t *)'
1> or 'bool match(const std::wstring &,const std::wstring &)'

wstring 和 wchar_t * 之间不应该有任何隐式转换(应该吗?),那么为什么会出现这些歧义呢?

提前致谢

最佳答案

第四个重载需要移到列表的顶部,以便它首先出现。

前三个重载都尝试调用第四个重载,但尚未声明,因此在重载解析时找不到。


std::wstring确实有一个允许 const wchar_t* 的转换构造函数隐式转换为 std::wstring .这是造成歧义的部分原因,尽管真正的问题是重载的顺序。

尽管对 match 的任何调用都不会调用第四个重载在前三个重载中,第三个重载中的调用只有歧义。原因如下:

inline bool match(const std::wstring & text1, const std::wstring & text2) // (1)
inline bool match(const std::wstring & text1, const wchar_t * text2) // (2)
inline bool match(const wchar_t * text1, const std::wstring & text2) // (3)
inline bool match(const wchar_t * text1, const wchar_t * text2) // (4)

调用match没有歧义在 (1) 因为只有一个名为 match 的函数此时可见。

调用match没有歧义在 (2) 中,因为 (2)(1) 更适合参数:

  • 要调用(2),第一个参数需要调用std::wstring转换构造函数和第二个参数完全匹配。

  • 要调用 (1),需要为两个参数调用转换构造函数。

(3) 出现歧义是因为三个可用重载都不是“最佳”:

  • 要调用 (1),需要为两个参数调用转换构造函数。

  • 要调用 (2),需要为第一个参数调用转换构造函数,而第二个参数是完全匹配的。

  • 要调用 (3),第一个参数是完全匹配的,但需要为第二个参数调用转换构造函数。

这三者中没有一个明显优于其他两个。

如果 (4) 被移动到在其他重载之前声明,它将明确更好地匹配 (1) 中的调用, (2)(3) 因为这两个参数在所有三种情况下都是完全匹配的。

关于c++ - 重载 wstring 和 wchar_t 时的类似转换 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541814/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com