错误:'operator []'未定义

时间:2011-08-18 10:53:37

标签: c++ templates operator-overloading

我在使用g ++编译我的库中与运算符[]相关的片段时遇到了问题。

我用这段代码重新创建了同样的问题:

    template<class A,class B> class X {
    public: 
        template<class C> X<C,B>& operator[]( const C& );
    };

    template<class A,class B,class C> class Y : public X<C,B> {
        friend X<C,B>& X<A,B>::template operator[]<C>( const C& );
    private:
        Y( X<A,B>& object , const C& index ) : X<C,B>() {};
    };

    template<class A,class B> template<class C> X<C,B>& X<A,B>::operator[]( const C& index ) {
        return *( new Y<A,B,C>( *this , index ) );
    }

    int main() {
        X<int,void> x;
        X<int,void>& y = x[2];
    }

g ++退出时出现以下错误:

./src/test.cpp: In instantiation of ‘Y<int, void, int>’:
./src/test.cpp:14:   instantiated from ‘X<C, B>& X<A, B>::operator[](const C&) [with C = int, A = int, B = void]’
./src/test.cpp:19:   instantiated from here
./src/test.cpp:8: error: ‘operator[]’ not defined
./src/test.cpp: In member function ‘X<C, B>& X<A, B>::operator[](const C&) [with C = int, A = int, B = void]’:
./src/test.cpp:19:   instantiated from here
./src/test.cpp:10: error: ‘Y<A, B, C>::Y(X<A, B>&, const C&) [with A = int, B = void, C = int]’ is private
./src/test.cpp:14: error: within this context

我认为问题出现在Y类的'operator []'的朋友声明中,但我不知道它在哪里错了。我试着搜索自己,但找不到任何有用的东西。 任何人都可以帮助我吗?

谢谢,Gianni

1 个答案:

答案 0 :(得分:2)

既然你没有告诉你真正的设计目标是什么,提出一些好的东西有点困难,但至少使用

template<class CC> friend X<CC,B>& X<A,B>::operator[]( const CC& );

因为友情声明将使其编译,因为它告诉它是一个模板。

编辑:

再想一想,我认为你的代码也应该有效,因为它没有指定专业化。你有没有尝试过使用clang进行测试?这似乎是gcc中的一个bug ......