0

很容易理解为什么我们不能说:

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。

对罐头示例感到抱歉。我所说的没有剪切和粘贴的意思不仅是我实际上不能复制和粘贴,我无法解释我正在尝试做什么,因为规则和规定。

4

1 回答 1

0

在 C++11 中,您可以使转换运算符显式:

explicit operator A*();

那么它只会在类似的情况下使用static_cast<A*>(somefooinstance)

于 2013-02-21T00:17:38.433 回答