Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.207.144] |
|
Сообщ.
#1
,
|
|
|
Приветствую
Написал парочку, троечку математических библиотек. Компилируется нормально, но потом ловлю LNK ошибки. Обычно они возникали если параметры передаются одни, а определяются другие, но сейчас этого вроде нет Вот код (часть): template <class TYPE> class TMyFSVector4; template <class TYPE> class TMyFSMatrix { // данные класса public: union { struct { TYPE m11, m12, m13, m14; TYPE m21, m22, m23, m24; TYPE m31, m32, m33, m34; TYPE m41, m42, m43, m44; }; TYPE pM[16]; TYPE m[4][4]; }; // конструкторы public: TMyFSMatrix(); TMyFSMatrix(const TYPE*); TMyFSMatrix(const TMyFSMatrix&); TMyFSMatrix(TYPE _11, TYPE _12, TYPE _13, TYPE _14, TYPE _21, TYPE _22, TYPE _23, TYPE _24, TYPE _31, TYPE _32, TYPE _33, TYPE _34, TYPE _41, TYPE _42, TYPE _43, TYPE _44); // методы класса public: // операции доступа inline TYPE& operator () (TUint uiRow, TUint uiColumn); inline TYPE operator () (TUint uiRow, TUint uiColumn) const; // унарные операции TMyFSMatrix operator + () const; TMyFSMatrix operator - () const; // бинарные операции TMyFSMatrix operator * (const TMyFSMatrix&) const; TMyFSMatrix operator + (const TMyFSMatrix&) const; TMyFSMatrix operator - (const TMyFSMatrix&) const; TMyFSVector4<TYPE> operator * (const TMyFSVector4<TYPE>&) const; TMyFSMatrix operator * (TYPE) const; TMyFSMatrix operator / (TYPE) const; friend TMyFSMatrix operator * (TYPE, const TMyFSMatrix&); // операции присваивания TMyFSMatrix& operator *= (const TMyFSMatrix&); TMyFSMatrix& operator += (const TMyFSMatrix&); TMyFSMatrix& operator -= (const TMyFSMatrix&); TMyFSMatrix& operator *= (TYPE); TMyFSMatrix& operator /= (TYPE); // операции сравнения TBool operator == (const TMyFSMatrix&) const; TBool operator != (const TMyFSMatrix&) const; // методы TMyFSMatrix& Identity(); TMyFSMatrix& Reset(); TMyFSMatrix& Transpose(); }; /* Конструкторы класса TMyFSMatrix */ template <class TYPE> TMyFSMatrix<TYPE>::TMyFSMatrix() { for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) m[uiRow][uiColumn] = 0; } template <class TYPE> TMyFSMatrix<TYPE>::TMyFSMatrix(const TYPE* pArray) { Mem::Copy(m, pArray, sizeof(m)); } template <class TYPE> TMyFSMatrix<TYPE>::TMyFSMatrix(const TMyFSMatrix<TYPE>& oMatrix) { Mem::Copy(m, oMatrix.m, sizeof(m)); } template <class TYPE> TMyFSMatrix<TYPE>::TMyFSMatrix<TYPE>(TYPE _11, TYPE _12, TYPE _13, TYPE _14, TYPE _21, TYPE _22, TYPE _23, TYPE _24, TYPE _31, TYPE _32, TYPE _33, TYPE _34, TYPE _41, TYPE _42, TYPE _43, TYPE _44) { m11 = _11; m12 = _12; m13 = _13; m14 = _14; m21 = _21; m22 = _22; m23 = _23; m24 = _24; m31 = _31; m32 = _32; m33 = _33; m34 = _34; m41 = _41; m42 = _42; m43 = _43; m44 = _44; } /* Методы класса */ // операции доступа template <class TYPE> inline TYPE& TMyFSMatrix<TYPE>::operator () (TUint uiRow, TUint uiColumn) { return m[uiRow][uiColumn]; } template <class TYPE> inline TYPE TMyFSMatrix<TYPE>::operator () (TUint uiRow, TUint uiColumn) const { return m[uiRow][uiColumn]; } // унарные операции template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator + () const { return *this; } template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator - () const { TMyFSMatrix<TYPE> self = *this; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) self.m[uiRow][uiColumn] = - m[uiRow][uiColumn]; return self; } // бинарные операции template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator * (const TMyFSMatrix<TYPE>& oMatrix) const { TMyFSMatrix<TYPE> oTotalMatrix; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) { oTotalMatrix.m[uiRow][uiColumn] = 0.0f; for (TInt uiElement = 0; uiElement < 4; ++uiElement) oTotalMatrix.m[uiRow][uiColumn] += m[uiElement][uiRow] * oMatrix.m[uiColumn][uiElement]; } return oTotalMatrix; } template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator + (const TMyFSMatrix<TYPE>& oMatrix) const { TMyFSMatrix<TYPE> oTotalMatrix; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) oTotalMatrix.m[uiRow][uiColumn] = m[uiRow][uiColumn] + oMatrix.m[uiRow][uiColumn]; return oTotalMatrix; } template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator - (const TMyFSMatrix<TYPE>& oMatrix) const { TMyFSMatrix<TYPE> oTotalMatrix; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) oTotalMatrix.m[uiRow][uiColumn] = m[uiRow][uiColumn] - oMatrix.m[uiRow][uiColumn]; return oTotalMatrix; } template <class TYPE> TMyFSVector4<TYPE> TMyFSMatrix<TYPE>::operator * (const TMyFSVector4<TYPE>& oVector) const { TMyFSVector4<TYPE> oTotalVector; for (TUint uiRow = 0; uiRow < 4; ++uiRow) { oTotalVector.pV[uiRow] = 0.0f; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) oTotalVector.pV[uiRow] += m[uiRow][uiColumn] * oVector.pV[uiColumn]; } return oTotalVector; } template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator * (TYPE fNumber) const { TMyFSMatrix<TYPE> oTotalMatrix; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) oTotalMatrix.m[uiRow][uiColumn] = m[uiRow][uiColumn] * fNumber; return oTotalMatrix; } template <class TYPE> TMyFSMatrix<TYPE> TMyFSMatrix<TYPE>::operator / (TYPE fNumber) const { TMyFSMatrix<TYPE> oTotalMatrix; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) oTotalMatrix.m[uiRow][uiColumn] = m[uiRow][uiColumn] / fNumber; return oTotalMatrix; } template <class TYPE> TMyFSMatrix<TYPE> operator * (TYPE fNumber, const TMyFSMatrix<TYPE>& oMatrix) { return oMatrix * fNumber; } // операции присваивания template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::operator *= (const TMyFSMatrix<TYPE>& oMatrix) { const TMyFSMatrix<TYPE> self = *this; for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) { m[uiRow][uiColumn] = 0.0f; for (TInt uiElement = 0; uiElement < 4; ++uiElement) m[uiRow][uiColumn] += self.m[uiElement][uiRow] * oMatrix.m[uiColumn][uiElement]; } return *this; } template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::operator += (const TMyFSMatrix<TYPE>& oMatrix) { for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) m[uiRow][uiColumn] -= oMatrix.m[uiRow][uiColumn] ; return *this; } template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::operator -= (const TMyFSMatrix<TYPE>& oMatrix) { for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) m[uiRow][uiColumn] -= oMatrix.m[uiRow][uiColumn] ; return *this; } template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::operator *= (TYPE fNumber) { for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) m[uiRow][uiColumn] *= fNumber; return *this; } template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::operator /= (TYPE fNumber) { for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) for (TUint uiRow = 0; uiRow < 4; ++uiRow) m[uiRow][uiColumn] /= fNumber; return *this; } // операции сравнения template <class TYPE> TBool TMyFSMatrix<TYPE>::operator == (const TMyFSMatrix<TYPE>& oMatrix) const { return !(*this != oMatrix); } template <class TYPE> TBool TMyFSMatrix<TYPE>::operator != (const TMyFSMatrix<TYPE>& oMatrix) const { return (TBool)Mem::Compare((TUint8*)m, sizeof(m), (TUint8*)oMatrix.m, sizeof(oMatrix.m)); } // методы // построить единичную матрицу template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::Identity() { for (TUint uiRow = 0; uiRow < 4; ++uiRow) for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) if (uiRow != uiColumn) m[uiRow][uiColumn] = 0.0f; else m[uiRow][uiColumn] = 1.0f; return *this; } // построить нулевую матрицу template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::Reset() { for (TUint uiElement = 0; uiElement < 16; ++uiElement) pM[uiElement] = 0.0f; return *this; } // транспонировать матрицу template <class TYPE> TMyFSMatrix<TYPE>& TMyFSMatrix<TYPE>::Transpose() { const TMyFSMatrix<TYPE> self = *this; for (TUint uiRow = 0; uiRow < 4; ++uiRow) for (TUint uiColumn = 0; uiColumn < 4; ++uiColumn) m[uiRow][uiColumn] = self.m[uiColumn][uiRow]; return *this; } а вот что лезет Цитата unresolved external symbol "public: __thiscall TMyFSMatrix<float>::TMyFSMatrix<float>(void)" (??0?$TMyFSMatrix@M@@QAE@XZ) unresolved external symbol "public: __thiscall TMyFSVector3<float>::TMyFSVector3<float>(float,float,float)" (??0?$TMyFSVector3@M@@QAE@MMM@Z) unresolved external symbol "public: __thiscall TMyFSVector3<float>::TMyFSVector3<float>(void)" (??0?$TMyFSVector3@M@@QAE@XZ) unresolved external symbol "class TMyFSVector3<float> __cdecl FSVec3Cross<float>(class TMyFSVector3<float> const *,class TMyFSVector3<float> const *)" (??$FSVec3Cross@M@@YA?AV?$TMyFSVector3@M@@PBV0@0@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::CalculateNormals(void)" (?CalculateNormals@CMyFSTerrainModel@@QAEXXZ) unresolved external symbol "class TMyFSVector4<float> __cdecl FSMatrixExtractRow<float>(class TMyFSMatrix<float> const *,unsigned int)" (??$FSMatrixExtractRow@M@@YA?AV?$TMyFSVector4@M@@PBV?$TMyFSMatrix@M@@I@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::FrustumCulling(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?FrustumCulling@CMyFSTerrainModel@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "float __cdecl FSVec3DistanceSq<float>(class TMyFSVector3<float> const *,class TMyFSVector3<float> const *)" (??$FSVec3DistanceSq@M@@YAMPBV?$TMyFSVector3@M@@0@Z) referenced in function "public: void __thiscall CMyFSTerrainManager::Render(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?Render@CMyFSTerrainManager@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "public: __thiscall TMyFSMatrix<float>::TMyFSMatrix<float>(void)" (??0?$TMyFSMatrix@M@@QAE@XZ) referenced in function "public: int __thiscall CFSEngine::DoGameFrameL(class CWindowGc &,class RDrawableWindow &)" (?DoGameFrameL@CFSEngine@@QAEHAAVCWindowGc@@AAVRDrawableWindow@@@Z) unresolved external symbol "public: __thiscall TMyFSVector3<float>::TMyFSVector3<float>(float,float,float)" (??0?$TMyFSVector3@M@@QAE@MMM@Z) referenced in function "public: int __thiscall CFSEngine::DoGameFrameL(class CWindowGc &,class RDrawableWindow &)" (?DoGameFrameL@CFSEngine@@QAEHAAVCWindowGc@@AAVRDrawableWindow@@@Z) unresolved external symbol "public: __thiscall TMyFSVector3<float>::TMyFSVector3<float>(void)" (??0?$TMyFSVector3@M@@QAE@XZ) referenced in function "public: __thiscall CMyFSTerrainManager::CMyFSTerrainManager(void)" (??0CMyFSTerrainManager@@QAE@XZ) unresolved external symbol "public: __thiscall TMyFSVector4<float>::TMyFSVector4<float>(float,float,float,float)" (??0?$TMyFSVector4@M@@QAE@MMMM@Z) referenced in function "public: void __thiscall CMyFSTerrainManager::Render(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?Render@CMyFSTerrainManager@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "public: __thiscall TMyFSVector4<float>::TMyFSVector4<float>(void)" (??0?$TMyFSVector4@M@@QAE@XZ) referenced in function "public: void __thiscall CMyFSTerrainModel::FrustumCulling(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?FrustumCulling@CMyFSTerrainModel@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "public: class TMyFSMatrix<float> & __thiscall TMyFSMatrix<float>::Identity(void)" (?Identity@?$TMyFSMatrix@M@@QAEAAV1@XZ) referenced in function "public: int __thiscall CFSEngine::DoGameFrameL(class CWindowGc &,class RDrawableWindow &)" (?DoGameFrameL@CFSEngine@@QAEHAAVCWindowGc@@AAVRDrawableWindow@@@Z) unresolved external symbol "public: class TMyFSMatrix<float> __thiscall TMyFSMatrix<float>::operator*(class TMyFSMatrix<float> const &)const " (??D?$TMyFSMatrix@M@@QBE?AV0@ABV0@@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::FrustumCulling(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?FrustumCulling@CMyFSTerrainModel@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "public: class TMyFSVector3<float> & __thiscall TMyFSVector3<float>::Normalize(void)" (?Normalize@?$TMyFSVector3@M@@QAEAAV1@XZ) referenced in function "public: void __thiscall CMyFSTerrainModel::CalculateNormals(void)" (?CalculateNormals@CMyFSTerrainModel@@QAEXXZ) unresolved external symbol "public: class TMyFSVector3<float> __thiscall TMyFSVector3<float>::operator-(class TMyFSVector3<float> const &)const " (??G?$TMyFSVector3@M@@QBE?AV0@ABV0@@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::CalculateNormals(void)" (?CalculateNormals@CMyFSTerrainModel@@QAEXXZ) unresolved external symbol "public: class TMyFSVector4<float> & __thiscall TMyFSVector4<float>::operator/=(float)" (??_0?$TMyFSVector4@M@@QAEAAV0@M@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::FrustumCulling(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?FrustumCulling@CMyFSTerrainModel@@QAEXABV?$TMyFSMatrix@M@@0@Z) unresolved external symbol "public: class TMyFSVector4<float> __thiscall TMyFSVector4<float>::operator-(class TMyFSVector4<float> const &)const " (??G?$TMyFSVector4@M@@QBE?AV0@ABV0@@Z) referenced in function "public: void __thiscall CMyFSTerrainModel::FrustumCulling(class TMyFSMatrix<float> const &,class TMyFSMatrix<float> const &)" (?FrustumCulling@CMyFSTerrainModel@@QAEXABV?$TMyFSMatrix@M@@0@Z) |
Сообщ.
#2
,
|
|
|
А определение методов у тебя в хидере или в срр???
ЗЫ: Такие исходники лучше файлами к мессаге аттачить, а то скролер на мышке дымится. |
Сообщ.
#3
,
|
|
|
определение методов в .h
а их описание в .cpp в общем в .h голые классы и функции а {код} в .cpp вот присоединил файл Прикреплённый файлEngine.rar1 (6.05 Кбайт, скачиваний: 182) |
Сообщ.
#4
,
|
|
|
Lucifer, брррр
а по русски plz Добавлено Lucifer Точно - помогло!!! А теперь вопрос - что это за фигня и как ее забороть? |
Сообщ.
#5
,
|
|
|
Цитата Fireman @ А теперь вопрос - что это за фигня и как ее забороть? Никак. Промежуточный вариант - вынести всю реализацию шаблона в отдельный файл, а в .h-нике сделать #include этого файла. |
Сообщ.
#6
,
|
|
|
Угу, Lucifer прав. Если определение методов в cpp, то при обработке этого файла компилер незнает конкретных типов и потому никакой код не генерит. А вот когда он начинает компилить файл из которого все это вызывается, то он делает предположение, что нужные методы уже закомпилены в другом файле, и перекладует все на линковщика, ну а что в этом случае говорит линковщик, ты уже видал
|
Сообщ.
#7
,
|
|
|
т.е.
my.h class CMy { CMy(); }; my.cpp CMy::CMy() {} это хорошо и работает -------------------- my.h template <class TYPE> class CMy { CMy(); }; my.cpp template <class TYPE> CMy<TYPE>::CMy() {} это уже не работает ------------------------ Но вроде раньше, когда я писал такая вещь работала Или я тогда наоборот - в cpp писал то что сейчас в h, а в h - то что в cpp странно |
Сообщ.
#8
,
|
|
|
Люди, а зачем выносить в DLL то, что всё равно можно использовать только в одном проекте. Не забывайте, шаблоны принадлежность C++, а декорирование имён меняется от компилятора к компилятор. Не дучше ли написать нормальные С(не С++)-функции, и снабдить их обёртками. Не говоря уж о том, что в DLL-ках всё равно не будет функциё, которые не инстанцированы.
|