Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > не работает программа


Автор: Annuta 1.7.2010, 12:47
Написала простенький шаблонный класс
Код

#include "TTrack.h"
template <typename T, int columns, int rows>
TTrack<T, columns, rows>::TTrack()
{
    p = new T(columns*rows);
    for(int i=0; i < rows; i++)
        for(int j=0; j < columns; j++)
            *(p+i*columns+j)=1;
}

template <typename T, int columns, int rows>
void TTrack<T, columns, rows>::Print()
{
    for(int i=0; i < rows; i++)
        for(int j=0; j < columns; j++)
            cout<<"Template matrix "<<*(p+i*columns+j)<<endl;
}


Код

#ifndef TTrack_H
#define TTrack_H
#include <iostream>

using namespace std;

template <typename T, int columns, int rows>
class TTrack
{
    T *p;
    public:
        TTrack();
        void Print();
};

#endif

 пытаюсь использовать так:
Код

main.cpp 

TTrack<int, 4,5> Matrix;

каманда make собирает исполняемый файл без ошибок, но при попытке запустить его я получаю такую ошибку
Код

main.o: In function `main':
main.cpp:(.text+0x649): undefined reference to `TTrack<int, 4, 5>::TTrack()'
collect2: ld returned 1 exit status
make: *** [MTrack] Ошибка 1

не понимаю, что не так...  Помогите плиз разобраться ... Ubuntu 10.04 gcc version 4.4.3 


Автор: dengalf 1.7.2010, 13:01
если не ошибаюсь
Код

int t;
TTrack<t, 4,5> Matrix;

Автор: SenkraD 1.7.2010, 13:04
Annuta,  я так понимаю, что у вас для класса есть и хедер и срр-файл?
Если да, то это не верно!!! - компилятор должен видеть реализацию шаблона везде -
перенесите его реализацию в хедер под обьявление или напишите inplace реализацию

Конструктор у вас, кстати, неверный - там квадратные скобочки для new нужны

Автор: Annuta 1.7.2010, 13:04
dengalf 
нет ... у меня так ничего не работает.
T - typename - так вроде нельзя писать, как ты предлагаешь...

SenkraD
Спасибо! Ща попробую!

Автор: SenkraD 1.7.2010, 13:06
dengalf,  не готите пожалуйста!
Если шаблону и можно засунуть переменную, то она должна быть
константой времени компиляции или иметь внешнее связывание

Автор: dengalf 1.7.2010, 13:06
Ага, сорри, недоглядел smile 

Автор: Annuta 1.7.2010, 13:07
SenkraD, СПАСИБО! 

Супер! Всё работает! 
У меня только такой вопрос, шаблонные классы в принципе всегда так пишутся без cpp файла ? Всё пишут в хедаре ? 

И ещё, что такое inplace реалзиция ? 






Автор: SenkraD 1.7.2010, 13:12
Annuta, ага. Рекомендую вам http://www.josuttis.com/tmplbook/ книгу, там многое обьяснят и укажут альтернтивы

Автор: Annuta 1.7.2010, 13:16
SenkraD, Спасибо!

Вопрос решён smile )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)