0

I'm having an odd problem writing some template classes and placing the implementation in a separate .CPP file - specifically I keep getting the following errors:

   Error    1   error C2143: syntax error : missing ';' before 'List<T>::begin'
   Error    2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Here is my dummy test code:
(proof of concept)

-= HEADER FILE =-
[Class]
template<typename T> class List
{
public:
    class A
    {
    };

    A begin() const;
};
[/Class]


-= IMPLEMENTATION FILE =-
[Class]
template<typename T> A List<T>::begin() const
{
    return A();
}
[Class]

Now, if I place this code directly into the header (.h) file it compiles without any errors, I only encounter issues when placing my functions within the separate implementation (CPP) file...

Any clues would be much appreciated.
Thanks,

Edited by mike_2000_17: Fixed formatting

4
Contributors
5
Replies
6
Views
8 Years
Discussion Span
Last Post by Tom Gunn
0

Because templates have to go in header files.

When you say something like List<int>, it needs to know what the template expansion of that template actually looks like to be able to
- declare instances of the class
- call class member functions with the right params
- etc

It also needs to generate the code for that type instance as well.

0

Sounds good to me, and I don't mind keeping everything within the header (that much) but I would still like to segment the implementation - like moving it to the bottom (as Alex F recommended) - but it still doesn't work...

If I include everything in the single .h file (as shown below) I get a new set of errors:
error C2143: syntax error : missing ';' before 'List<T>::begin'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

As well as the following warning
warning C4346: 'List<T>::A' : dependent name is not a type

template<typename T> class List
{
public:
	class A
	{
	};

	A begin() const;
};

template<typename T> List<T>::A List<T>::begin() const
{
	return A();
}

It really only seems to work if I put the implementation directly in the class itself... which makes the class defintion rather busy and hard to read...

Any clues what could be going wrong?
Thanks,

0

When the compiler complains about dependent names, it means you need to use the typename keyword to fix an ambiguity:

template<typename T> class List
{
public:
	class A
	{
	};

	A begin() const;
};

template<typename T>
typename List<T>::A List<T>::begin() const
{
	return A();
}
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.