Консультация № 72936
27.01.2007, 23:09
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты.
В приложении находится код, который почему то не компилируется. (M$ Visual C++ 6.0). Ошибка линковки:
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Matrix<int>::MatrixRow<int>::MatrixRow<int>(unsigned int)" (??0?$MatrixRow@H@?$Matrix@H@@QAE@I@Z)
Такое впечатление, что я как-то неправильно определил конструктор вложенного класса. Если этот конструктор определить сразу в описании класса, не вынося его отдельно - все работает. Вопрос - почему?
Заранее спасибо.

Приложение:
//matrix.hxx#ifndef __MATRIX_HXX__#define __MATRIX_HXX__#include <iostream>#include <vector>template <typename Type>class Matrix{public: Matrix(unsigned,unsigned);protected: template <typename Type> class MatrixRow { friend class Matrix<Type>; public: MatrixRow(unsigned); private: Type* m_pxStorage; };private: std::vector<MatrixRow<Type>*> m_xStorage; unsigned m_uRows; unsigned m_uColumns;};//class MatrixRow...template <typename Type>Matrix<Type>::MatrixRow<Type>::MatrixRow(unsigned uSize){std::cout << "MatrixRow has been created!" << std::endl;}//class Matrix...template <typename Type>Matrix<Type>::Matrix(unsigned uRows,unsigned uColumns) : m_uRows(uRows), m_uColumns(uColumns){ unsigned uCount=0; for(;uCount<m_uRows;++uCount) m_xStorage.push_back(new MatrixRow<Type>(m_uColumns));}#endif // __MATRIX_HXX__//main.cxx#include <iostream>#include "matrix.hxx"int main(void){ Matrix<int>* pxTmp=new Matrix<int>(2,3); return 0;}

Обсуждение

Неизвестный
27.01.2007, 23:24
общий
это ответ
Здравствуйте, Алексеев В.В.!
К сожалению , как описано в MSDN, для MSVC, их реализация ДОЛЖНА быть описана в h-файле (заголовочном файле). Иначе проект не слинкуется.
Ответ - таков MSVC. Если угодно - глюк (или фича) :)
Неизвестный
28.01.2007, 00:25
общий
это ответ
Здравствуйте, Алексеев В.В.!

Зачем Вам вообще вложенный класс? Нет возможности проверить, но есть подозрение, что в описании класса нужно выкинуть внутренний template.. (см. приложение)


Приложение:
template <typename Type>class Matrix{public: Matrix(unsigned,unsigned);protected: class MatrixRow { friend class Matrix<Type>; public: MatrixRow(unsigned); private: Type* m_pxStorage; };private: std::vector<MatrixRow<Type>*> m_xStorage; unsigned m_uRows; unsigned m_uColumns;};А здесь:template <typename Type>Matrix<Type>::MatrixRow<Type>::MatrixRow(unsigned uSize)илиtemplate <typename Type>Matrix<Type>::MatrixRow::MatrixRow(unsigned uSize)
Форма ответа