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


Автор: suctas 7.4.2010, 18:29
На C++ программирую редко. Сегодня понадобилось использовать шаблоны. Только начал писать класс, сразу возникла проблема...
В общем имеется следующее:
Код

#matrix.h:
template <class T>
class Matrix
{
public:
    Matrix(int rows = 5, int cols = 5);
private:
    int rowsField;
    int colsField;
};

#matrix.cpp:
template <class T>
Matrix<T>::Matrix<T>(int rows, int cols)
{
    rowsField = rows;
    colsField = cols;
}

#main.cpp:
int main()
{
    Matrix<int> m(5, 5);
    return 0;
}

Возникает ошибка: "....\Laboratory 15\main.cpp|6|undefined reference to `Matrix<int>::Matrix(int, int)'|". И такая ошибка возникает в любом конструкторе (в конструкторе копирования - тоже), кроме конструктора без параметров.
Подскажите пожалуйста - в чем проблема? И как ее можно решить?

Заранее благодарен.

Автор: ИванМ 7.4.2010, 19:56
каким компилятором пользуетесь?
В Visual Studio работает.
попробуйте так:
Код

template <class T>
class Matrix
{
public:
    Matrix<T>(int rows = 5, int cols = 5);
private:
    int rowsField;
    int colsField;
};

Автор: azesmcar 7.4.2010, 19:59
suctas

Опять этот вопрос smile 
Экспорт шаблонов большинством компиляторов не поддерживается. Пиши реализацию функций в заголовочном файле.
Вот так
Код

#matrix.h:
template <class T>
class Matrix
{
public:
    Matrix(int rows = 5, int cols = 5)
   {
       rowsField = rows;
       colsField = cols;
   }

private:
    int rowsField;
    int colsField;
};

#main.cpp:
int main()
{
    Matrix<int> m(5, 5);
    return 0;
}


Автор: suctas 7.4.2010, 20:22
azesmcar, спасибо, помогло. 
Правда сделал немного подругому - создал два заголовочных файла, в одном объявление, во втором реализация, дабы не писать все в одной куче.

Автор: azesmcar 7.4.2010, 20:24
Цитата(suctas @  7.4.2010,  20:22 Найти цитируемый пост)
Правда сделал немного подругому - создал два заголовочных файла, в одном объявление, во втором реализация, дабы не писать все в одной куче. 

как угодно, правда я бы написал в куче как это обычно делают... весь STL так написан.

Автор: suctas 7.4.2010, 21:38
Цитата(azesmcar @  7.4.2010,  20:24 Найти цитируемый пост)
правда я бы написал в куче как это обычно делают... весь STL так написан. 

Просто я почему-то в C++ привык отделять объявление от реализации... Хотя первое время терпеть этого не мог, т.к. в основном пишу на C# и Java - а там, все "в куче"... smile

Автор: xvr 8.4.2010, 09:44
Цитата(suctas @  7.4.2010,  21:38 Найти цитируемый пост)
Просто я почему-то в C++ привык отделять объявление от реализации...
Угу, вот только для шаблонов это не работает  smile Для них можно файл с реализацией включить include'ом в файл с определением (в конце).
NB. Для НЕ ШАБЛОНОВ этого делать КАТЕГОРИЧЕСКИ нельзя.


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