template<typename T>
class Base
{
protected:
Base() {}
T& get() { return t; }
T t;
};
template<typename T>
class Derived : public Base<T>
{
public:
Base<T>::get; // Line A
Base<T>::t; // Line B
void foo() { t = 4; get(); }
};
int main() { return 0; }
Если я прокомментирую строки A и B, этот код компилируется в Visual Studio 2008. Тем не менее, когда я компилирую под GCC 4.1, когда строки A и B комментируются, я получаю следующие ошибки:
В функции-члена 'void Derived:: foo():
error: 't не был объявлен в этой области
error: нет аргументов, чтобы "получить, что зависит от параметра шаблона, поэтому объявление" get должно быть доступно "
Почему одному компилятору нужны строки A и B, а другой нет? Есть ли способ упростить это? Другими словами, если производные классы используют 20 вещей из базового класса, я должен поместить 20 строк деклараций для каждого класса, полученного из Base! Есть ли способ вокруг этого, который не требует так много объявлений?