g++ template parameter error

c++, g++, templates

Solution

I noticed that the `GetContainer` function is a method of `ObjCollection`, while `Insert` is a member of `DynamicObjectCollection`. From this, I'm going to assume that `DynamicObjectCollection` inherits from `ObjectCollection`.

If this is indeed the case, the problem is that when you write a template class that inherits from a template base class, the way that name lookup works is slightly different from name lookup in normal classes. In particular, you cannot just reference base class members using their names; you need to indicate to the compiler where to look for the name. The reason this works in Visual Studio is that the Microsoft C++ compiler actually gets this behavior wrong and allows code that is technically illegal to compile just fine.

If you want to invoke the `GetContainer` function of the base class, you have two options. First, you can explicitly indicate that the call is to a member function:

this->GetContainer().insert(&t);

Now that the compiler knows that `GetContainer` is a member of `DynamicObjectCollection`, it knows that it might need to look up `GetContainer` in the base class, and so it will defer name lookup until the template is instantiated.

The other option available would be to add a `using` declaration into the class body:

template <typename I, typename T>
class DynamicObjectCollection: public ObjectCollection<I, T, /* ? */> {
public:
    using ObjectCollection<I, T, /* ? */>::GetContainer;

    /* ... */
};

This also indicates unambiguously to the compiler that `GetContainer` may be defined in the base class, and so it defers lookup until template instantiation.

If this isn't applicable to your situation, let me know and I can delete this post.

Hope this helps!

Problem

I have GetContainer() function as follows. ``` template<typename I,typename T,typename Container> Container& ObjCollection<I,T,Container>::GetContainer() { return mContainer; } ``` When I use this method as follows ``` template<typename I,typename T> T& DynamicObjCollection<I,T>::Insert(T& t) { GetContainer().insert(&t); return t; } ``` I got errors. ``` error: there are no arguments to ‘GetContainer’ that depend on a template parameter, so a declaration of ‘GetContainer’ must be available error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated) ``` It works fine with MSVC, but g++ is not so permissive. What's wrong with the code?

Original source