Наследование внутри шаблона - публичные участники становятся невидимыми? - PullRequest
0 голосов
/ 14 июня 2010

Я пытаюсь использовать наследование среди классов, определенных внутри шаблона класса (внутренние классы). Однако компилятор (GCC) отказывается предоставить мне доступ к открытым членам в базовом классе.

Пример кода:

template <int D>
struct Space {
    struct Plane {
        Plane(Space& b);
        virtual int& at(int y, int z) = 0;
        Space& space;             /* <= this member is public */
    };

    struct PlaneX: public Plane {
        /* using Plane::space; */
        PlaneX(Space& b, int x);
        int& at(int y, int z);
        const int cx;
    };

    int& at(int x, int y, int z);
};

template <int D>
int& Space<D>::PlaneX::at(int y, int z) {
    return space.at(cx, y, z);  /* <= but it fails here */
};

Space<4> sp4;

Компилятор говорит:

file.cpp: In member function ‘int& Space::PlaneX::at(int, int)’:
file.cpp:21: error: ‘space’ was not declared in this scope

Если к определению класса PlaneX добавлено using Plane::space;, или если доступ к члену базового класса осуществляется с помощью указателя this, или если класс Space заменен на не шаблонный класс, то компилятор в порядке с это.

Я не знаю, является ли это каким-то неясным ограничением C ++ или ошибкой в ​​GCC (тестируются версии 4.4.1 и 4.4.3 GCC). У кого-нибудь есть идея?

1 Ответ

1 голос
/ 14 июня 2010

Это должно быть проблемой, связанной с двухфазным поиском имени в c ++:

http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Name-lookup.html#Name-lookup

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