Why does GCC need extra declarations in templates when VS does not?
- by Kyle
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; }
If I comment out lines A and B, this code compiles fine under Visual Studio 2008.  Yet when I compile under GCC 4.1 with lines A and B commented, I get these errors:
  In member function ‘void TemplateDerived::foo()’:
   error: ‘t’ was not declared in this scope
   error: there are no arguments to ‘get’ that depend on a template parameter, so a declaration of ‘get’ must be available
Why would one compiler require lines A and B while the other doesn't?  Is there a way to simplify this?  In other words, if derived classes use 20 things from the base class, I have to put 20 lines of declarations for every class deriving from Base!  Is there a way around this that doesn't require so many declarations?