URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6768
[ Назад ]

Исходное сообщение
"g++ и шаблоны"

Отправлено dimus , 18-Сен-07 13:48 
Решил малость побаловаться с шаблонами и натолкнулся на странное поведение компилятора (или на свою криворукость :) ). Программа проще некуда:

#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


Содержание

Сообщения в этом обсуждении
"g++ и шаблоны"
Отправлено sascha , 18-Сен-07 14:18 
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


"g++ и шаблоны"
Отправлено dimus , 18-Сен-07 14:33 
>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];
}"

                    
Как говорится, век живи, век учись :)