gpt4 book ai didi

c++ - 为什么 g++ 说 'no match for ‘operator=’ 显然存在,而 Visual Studio 可以看到存在?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:05 24 4
gpt4 key购买 nike

我正在编写一个接口(interface)库,它允许访问类型为 regula::State 的对象中表中的变量(理论上无限深度)。我通过在一个类中重载 operator[] 来实现这一点,然后返回同一类的另一个,并根据需要再次调用 operator[] 。例如:

regula::State t;
t["math"]["pi"] = 3.14159;

上面的代码应该将值 3.14159 放在表 math 的变量 pi 中。基本上,它通过让 t 返回一个代表 math 的代理对象来实现这一点,它返回另一个代表 pi 的代理对象,我们实际上将多变的。它的内部结构与问题并不相关,但这里是函数头。

LObject LObject::operator[] (const std::string name);

基本上,在上面的例子中,程序应该用字符串"math"调用toperator[]并返回另一个对象,然后使用字符串 "pi" 调用该对象的 operator[],返回最终对象,然后使用 operator 将值赋给该对象=

template <typename T>
T LObject::operator= (const T& value);

返回的 T 只是传递的 value 的拷贝。

现在,我的代码在 Visual C++ 2008 中不会产生任何错误并且可以完美运行。但是,当我尝试在 Linux 上使用 g++ 编译它时,出现以下错误:

../../test/regula-test.cpp:100: error: no match for ‘operator=’ in 
‘L.regula::State::operator[](std::basic_string<char, std::char_traits<char>,
std::allocator<char> >(((const char*)"Numbers"), ((const std::allocator<char>&)((const
std::allocator<char>*)(& std::allocator<char>()))))) = Numbers’
../../include/regula.hpp:855: note: candidates are: regula::LObject&
regula::LObject::operator=(const regula::LObject&)

出于某种原因,g++ 似乎试图在 operator[] 上调用 operator=,而不是像它那样在返回的对象上调用应该是。

我实际上可以通过将 operator= 的返回类型替换为 void 来修复此错误:

template <typename T>
/*T*/ void LObject::operator= (const T& value);

但这不是可取的,此外,我在其他几个位置也有类似的重载 operator== 的类似错误:

../../test/regula-test.cpp:153: error: no match for ‘operator==’ in ‘pi == 
L.regula::State::operator[](std::basic_string<char, std::char_traits<char>,
std::allocator<char> >(((const char*)"pi"), ((const std::allocator<char>&)((const
std::allocator<char>*)(& std::allocator<char>())))))’

我不明白为什么这个错误会出现在 g++ 中,或者为什么它不会出现在 Visual C++ 中。任何人都可以阐明这一点或推荐任何解决方案吗?

最佳答案

ISO 标准第 5.17 节说

There are several assignment operators, all of which group right-to-left. All require a modifiable lvalue as their left operand, and the type of an assignment expression is that of its left operand. The result of the assignment operation is the value stored in the left operand after the assignment has taken place; the result is an lvalue.

您的 operator= 不仅返回了错误的类型,甚至没有返回左值。假设 GCC 的错误消息不包括除 operator=(const regula::LObject&) 之外的任何其他候选者,GCC 只是完全忽略了您的过载。它提到的 operator= 是默认的、自动生成的函数。

再看一眼,您的operator[] 也应该返回一个引用。如所写,像您的示例这样的赋值表达式根本不起作用。

所以,你应该有函数

LObject &LObject::operator[] (const std::string name);

template <typename T>
LObject &LObject::operator= (const T& value);

关于c++ - 为什么 g++ 说 'no match for ‘operator=’ 显然存在,而 Visual Studio 可以看到存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1947971/

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