ошибка: «оператор []» не определен - PullRequest
8 голосов
/ 18 августа 2011

У меня проблема с компиляцией с 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

Я думаю, что проблема в объявлении друга 'operator []' в классе Y, но я не знаю, где это неправильно.Я пытался искать себя, но не могу найти ничего полезного.Кто-нибудь может мне помочь?

Спасибо, Джанни

1 Ответ

2 голосов
/ 18 августа 2011

Поскольку вы не сказали, какова ваша реальная цель разработки, немного сложно предложить что-то хорошее, но, по крайней мере, используя

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

, поскольку объявление друга сделает его компилируемым, посколькуэто должен быть шаблон.

Редактировать:

Если подумать, я думаю, что ваш код тоже должен работать, так как он не определяет специализацию.Вы пытались использовать Clang для проверки?Кажется, там есть ошибка в gcc ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...