Возьмите этот код, например:
/*
* foo.h
*
* Created on: Nov 5, 2011
* Author: AutoBotAM
*/
#ifndef FOO_H_
#define FOO_H_
template<typename Type>
class Foo
{
public:
void Bar(Type object);
};
#endif /* FOO_H_ */
.
/*
* foo.cpp
*
* Created on: Nov 5, 2011
* Author: AutoBotAM
*/
#include <iostream>
using namespace std;
#include "foo.h"
template<typename Type>
void Foo<Type>::Bar(Type object)
{
cout << object;
}
.
/*
* main.cpp
*
* Created on: Oct 15, 2011
* Author: AutoBotAM
*/
#include <iostream>
using namespace std;
#include "foo.h"
Foo<int> foo;
int main()
{
cout << "The year is ";
foo.Bar(2011);
return 0;
}
Так я обычно объявляю не шаблонклассы.К сожалению, этот код приводит к ошибке ../src/main.cpp:18: undefined reference to 'Foo<int>::Bar(int)'
(в MinGW).Я кое-что прочитал, и оказалось, что вы должны объявить классы шаблонов в одном и том же модуле перевода, например:
/*
* foo.h
*
* Created on: Nov 5, 2011
* Author: AutoBotAM
*/
#ifndef FOO_H_
#define FOO_H_
template<typename Type>
class Foo
{
public:
void Bar(Type object)
{
cout << object;
}
};
#endif /* FOO_H_ */
Мой большой вопрос: зачем вам это делать?Я мог бы представить несколько подводных камней в разработке с этой схемой.Например, представьте, что у нас было 50 единиц перевода #inclusive foo.h
, и мы изменили значение на void Foo::Bar(Type)
.Поскольку Bar
находится в заголовочном файле, нам нужно дождаться компиляции всех 50 единиц перевода, прежде чем мы получим какие-либо результаты.Если бы у нас Bar
работал в foo.cpp
по отдельности, нам нужно было бы подождать только 1 единицу перевода для компиляции.Есть ли способы решить эту проблему?
Спасибо за любой совет!