【发布时间】:2010-12-29 05:04:20
【问题描述】:
我正在编写一个接口库,它允许访问regula::State 类型对象中的表中的变量(理论上可以达到无限深度)。我通过在一个类中重载operator[] 来实现这一点,然后返回同一个类的另一个,并根据需要再次调用operator[]。例如:
regula::State t;
t["math"]["pi"] = 3.14159;
上面应该将值3.14159 放在表math 中的变量pi 中。基本上,它通过让t 返回一个代表math 的代理对象来实现这一点,它返回另一个代表pi 的代理对象,我们实际上将变量保存到其中。 this 的内部与问题无关,但这里是函数头。
LObject LObject::operator[] (const std::string name);
基本上,在上面的例子中,程序应该用字符串"math"调用t的operator[]并返回另一个对象,然后用字符串"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++ 中没有出现。任何人都可以对此有所了解或推荐任何解决方案吗?
【问题讨论】:
-
发布真实代码。你的样品坏了。
regula::State t["math"]["pi"] = 3.14159;不能是有效的 C++ 语句。你的operator =的“固定”声明也被破坏了,因为现在那里没有T -
@AndreyT:我很抱歉,该行不应该被截断。我已经修复了有问题的样本。
-
你能把它归结为一个小sn-p来演示错误吗?
-
那么,当您在
operator =上使用void返回类型时,它会在 GCC 中编译和工作吗? -
这里没有什么明显的亮点。我们需要看到更多的实现来帮助你。但是根据经验和直觉,让我大胆猜测一下,您在模板代码的某处遗漏了
typename消歧器。 MSVC 让您可以忽略它,而 gcc 经常发出非直观的错误消息。
标签: c++ operators g++ compiler-errors