gpt4 book ai didi

c++ - 模板中的隐式转换和编译器强制

转载 作者:行者123 更新时间:2023-11-28 08:23:16 25 4
gpt4 key购买 nike

我有这个非常简单的包装器模板:

template<class T>
struct wrapper {
inline operator T () {
return v;
}

inline wrapper(T v):v(v) { }

T v;
};

尝试将它与任何非原始类型一起使用(例如)依赖于定义它的模板的比较运算符看起来没有希望:

std::string t = "test";
assert(t == t);

typedef wrapper<std::string> string_wrapper;
assert(string_wrapper(t) == string_wrapper(t));

GCC 4.4.5 提示这个错误:

error: no match for ‘operator==’ in ‘wrapper<std::basic_string<char> >(std::basic_string<char>(((const std::basic_string<char>&)((const std::basic_string<char>*)(& t))))) == wrapper<std::basic_string<char> >(std::basic_string<char>(((const std::basic_string<char>&)((const std::basic_string<char>*)(& t)))))’

有趣的是,GCC 三重转换模板,然后无法使用为 std::string 定义的 operator ==

我不认为隐式强制转换是不可能的,因为如果我将 std::string 更改为 intdoublebool 或任何原始类型,GCC 将选择正确的运算符。

我不想为 wrapper 结构定义 operator ==,因为那个操作符只是一个例子,我需要 wrapper 来“感觉”就像关于运算符的真实类型。

只是在转换中 GCC 误解了我的语法,如果我创建一个包装器并尝试将它与自身进行比较,GCC 再次提示(尽管没有三重转换)它找不到匹配的 == 运算符:

typedef wrapper<std::string> string_wrapper;
string_wrapper tw(t);
assert(tw == tw);

error: no match for ‘operator==’ in ‘tw == tw’

wrapper 提供转换时,为什么 GCC 不能找到和/或使用 std::string operator == std::string

最佳答案

该运算符 T 称为“转换运算符”或“转换函数”,而不是强制转换。 “转换”是隐含的;转换是显式的。

编译器找不到 std::string 的运算符==,因为重载解析规则不允许这种情况发生。有关您真正尝试做的事情的更多详细信息可能有助于提供解决方案。

关于c++ - 模板中的隐式转换和编译器强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012084/

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