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?
I noticed that the
GetContainer
function is a method ofObjCollection
, whileInsert
is a member ofDynamicObjectCollection
. From this, I'm going to assume thatDynamicObjectCollection
inherits fromObjectCollection
.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:Now that the compiler knows that
GetContainer
is a member ofDynamicObjectCollection
, it knows that it might need to look upGetContainer
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: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!