Я пытаюсь использовать наследование среди классов, определенных внутри шаблона класса (внутренние классы). Однако компилятор (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). У кого-нибудь есть идея?