На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> ошибки при линковке библиотк с шаблонами
    Приветствую

    Написал парочку, троечку математических библиотек. Компилируется нормально, но потом ловлю LNK ошибки. Обычно они возникали если параметры передаются одни, а определяются другие, но сейчас этого вроде нет

    Вот код (часть):
    ExpandedWrap disabled
      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();
      };


    ExpandedWrap disabled
      /* Конструкторы класса 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)
      А определение методов у тебя в хидере или в срр???
      ЗЫ: Такие исходники лучше файлами к мессаге аттачить, а то скролер на мышке дымится.
        определение методов в .h
        а их описание в .cpp

        в общем в .h голые классы и функции а {код} в .cpp

        вот присоединил файл
        Прикреплённый файлПрикреплённый файлEngine.rar1 (6.05 Кбайт, скачиваний: 182)
          Lucifer, брррр

          а по русски plz

          Добавлено
          Lucifer
          Точно - помогло!!!

          А теперь вопрос - что это за фигня и как ее забороть?
            Цитата Fireman @
            А теперь вопрос - что это за фигня и как ее забороть?

            Никак. Промежуточный вариант - вынести всю реализацию шаблона в отдельный файл, а в .h-нике сделать #include этого файла.
              Угу, Lucifer прав. Если определение методов в cpp, то при обработке этого файла компилер незнает конкретных типов и потому никакой код не генерит. А вот когда он начинает компилить файл из которого все это вызывается, то он делает предположение, что нужные методы уже закомпилены в другом файле, и перекладует все на линковщика, ну а что в этом случае говорит линковщик, ты уже видал ;)
                т.е.

                my.h
                ExpandedWrap disabled
                  class CMy
                  {
                       CMy();
                  };


                my.cpp
                ExpandedWrap disabled
                  CMy::CMy()
                  {}


                это хорошо и работает
                --------------------

                my.h
                ExpandedWrap disabled
                  template <class TYPE>
                  class CMy
                  {
                       CMy();
                  };


                my.cpp
                ExpandedWrap disabled
                  template <class TYPE>
                  CMy<TYPE>::CMy()
                  {}


                это уже не работает :(
                ------------------------

                Но вроде раньше, когда я писал такая вещь работала
                Или я тогда наоборот - в cpp писал то что сейчас в h, а в h - то что в cpp

                странно
                  Люди, а зачем выносить в DLL то, что всё равно можно использовать только в одном проекте. Не забывайте, шаблоны принадлежность C++, а декорирование имён меняется от компилятора к компилятор. Не дучше ли написать нормальные С(не С++)-функции, и снабдить их обёртками. Не говоря уж о том, что в DLL-ках всё равно не будет функциё, которые не инстанцированы.
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0445 ]   [ 15 queries used ]   [ Generated: 15.05.24, 00:02 GMT ]