很容易理解为什么我们不能说:
template<class A> class foo
{
//stuff
A& operator[](size_type n);
operator A*();
//more stuff
};
somefooinstance[bar];
...我们回来了“ISO C++ 说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换要好。”
当然,这意味着 gcc 不知道我们的意思是:
somefooinstance.operator[](bar);
或者我们的意思是:
(static_cast<A*>(somefooinstance))[bar];
现在,ISO C++ 说必须考虑所有转换,是吗?但是有没有办法强制选择优先级?属性似乎没有提供任何帮助。
(请不要“你真正想做什么?”回答。是的,这是一个固定的例子。山姆大叔不想让我剪切和粘贴代码。)
编辑:
有人想查看确切的代码:
template<class T, unsigned S> class foo
{
private:
T m_bar[S];
public:
inline T& operator[](unsigned s)
{
return m_bar[s];
}
inline operator T*()
{
return m_bar;
}
};
int main(int argc, char** argv)
{
foo<int, 100> test;
test[31] = 6;
}
产量:
23:警告:ISO C++ 说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换要好:
8 : 注意: 候选 1: T& foo::operator[](unsigned int) [with T = int, unsigned int S = 100u]
23 : 注意: 候选 2: operator[](int*, int)
... 不需要 -pedantic。
对罐头示例感到抱歉。我所说的没有剪切和粘贴的意思不仅是我实际上不能复制和粘贴,我无法解释我正在尝试做什么,因为规则和规定。