Решил малость побаловаться с шаблонами и натолкнулся на странное поведение компилятора (или на свою криворукость :) ). Программа проще некуда:#include <iostream>
using namespace std;
template <class Item> class Test
{
public:
Test();
};Test<class Item>::Test()
{
cout << "Я родился\n";
}int main( int argc, char* argv[] )
{
Test<int> test;
return 0;
}Только вот ну ни в какую не хочет компилироваться при помощи g++ :(
$ make
g++ -g app.o -o app
app.o(.text+0x160): In function `main':
app.cpp:18: undefined reference to `Test<int>::Test()'
*** Error code 1
Подскажите пожалуйтса, в чем косяк.
$ g++ --version
g++ (GCC) 3.4.6 [FreeBSD] 20060305
template<class Item>
Test<Item>::Test()
{
cout << "Я родился\n";
}>[оверквотинг удален]
>$ make
>g++ -g app.o -o app
>app.o(.text+0x160): In function `main':
>app.cpp:18: undefined reference to `Test<int>::Test()'
>*** Error code 1
>
>
>Подскажите пожалуйтса, в чем косяк.
>$ g++ --version
>g++ (GCC) 3.4.6 [FreeBSD] 20060305
>template<class Item>
>Test<Item>::Test()
>{
> cout << "Я родился\n";
>
>}Спасибо. Сам только что это нашел у Страуструпа :)
"...В этом случае определение функции-члена stack должно быть дано где-то в другом месте, как это и было для функций- членов обычных, нешаблонных классов. Подобные функции так же параметризируются типом, служащим параметром для их шаблонного класса, поэтому определяются они с помощью шаблона типа для функции. Если это происходит вне шаблонного класса, это надо делать явно:
template<class T> void stack<T>::push(T a)
{
*p++ = a;
}template<class T> stack<T>::stack(int s)
{
v = p = new T[sz=s];
}"
Как говорится, век живи, век учись :)