Ошибки линкера

Тема в разделе "LANGS.C", создана пользователем Antolflash, 17 май 2011.

  1. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Вот объясните, как научиться их понимать?
    Вот приведу пример кода, который не линкуется

    хэдэр mh.h
    Код (Text):
    1. template <class type, class size>
    2. class matrix
    3. {
    4.     type *data;
    5.     size m, n, mn;
    6.     void error(char *msg);
    7. public:
    8.     size getm() const;
    9.     size getn() const;
    10.     size getmn() const;
    11.     matrix operator*(matrix &op2);
    12.     matrix operator+(matrix &op2);
    13.     matrix &operator=(matrix &op2);
    14.     matrix &operator=(type &op2);
    15.     type &matrix::operator()(size i, size j);
    16.     type &matrix::operator[](size k);
    17.     matrix(const matrix &obj);
    18.     matrix(size m, size n);
    19.     ~matrix();
    20. };
    код mc.cpp
    Код (Text):
    1. #include "mh.h"
    2. #include "mh.h"
    3. template <class type, class size>
    4. void matrix<type, size>::error(char *msg)
    5. {
    6.  
    7. }
    8.  
    9. template <class type, class size>
    10. matrix<type, size>::matrix(size _m_, size _n_)
    11. {
    12.     m = _m_;
    13.     n = _n_;
    14.     mn = m * n;
    15.     data = new type[mn];
    16.     if (!data)
    17.         error("ololo");
    18. }
    19.  
    20.  
    21. template <class type, class size>
    22. matrix<type, size>::~matrix()
    23. {
    24.     delete[] data;
    25. }
    26.  
    27. template <class type, class size>
    28. matrix<type, size>::matrix(const matrix<type, size> &obj)
    29. {
    30.     size k;
    31.     m = obj.getm();
    32.     n = obj.getn();
    33.     mn = obj.getmn();
    34.     data = new type[mn];
    35.     for (k = 0; k < mn; k++)
    36.         data[k] = obj[k];
    37. }
    38.  
    39.  
    40.  
    41. template <class type, class size>
    42. matrix<type, size> &matrix<type, size>::operator=(matrix<type, size> &op2)
    43. {
    44.     size k;
    45.     for (k = 0; k < mn; k++)
    46.         data[k] = op2[k];
    47.     return *this;
    48. }
    49.  
    50. template <class type, class size>
    51. matrix<type, size> &matrix<type, size>::operator=(type &op2)
    52. {
    53.     size k;
    54.     for (k = 0; k < mn; k++)
    55.         data[k] = op2;
    56.     return *this;
    57. }
    58.  
    59. template <class type, class size>
    60. type &matrix<type, size>::operator()(size i, size j)
    61. {
    62.     return data[i * m + j];
    63. }
    64.  
    65. template <class type, class size>
    66. type &matrix<type, size>::operator[](size k)
    67. {
    68.     return data[k];
    69. }
    70.  
    71. template <class type, class size>
    72. size matrix<type, size>::getm() const
    73. {
    74.     return m;
    75. }
    76.  
    77. template <class type, class size>
    78. size matrix<type, size>::getn() const
    79. {
    80.     return n;
    81. }
    82.  
    83. template <class type, class size>
    84. size matrix<type, size>::getmn() const
    85. {
    86.     return mn;
    87. }
    88.  
    89. template <class type, class size>
    90.  matrix<type, size> matrix<type, size>::operator*(matrix &op2)
    91.  {
    92.      size i, j, k;
    93.      type buf;
    94.      buf = 0;
    95.      matrix<type, size> result(m, op2.n);
    96. #ifdef SAFETY
    97.      if (n != op2.m)
    98.      {
    99.          error("size error");
    100.          return result;
    101.      }
    102. #endif
    103.      for (i = 0; i < m; i++)
    104.          for (j = 0; j < n; j++)
    105.          {
    106.              for (k = 0; k < n; k++)
    107.                  buf += data[i * m + k] * op2(k, j);
    108.              result(i, j) = buf;
    109.          }
    110.     return result;
    111.  }
    112.  
    113.  template <class type, class size>
    114.  matrix<type, size> matrix<type, size>::operator+(matrix &op2)
    115.  {
    116.      size k;
    117.      matrix<type, size> result;
    118.     #ifdef SAFETY
    119.         if (m != op2.getm() || n != op2.getn())
    120.         {
    121.             error("error in summing matrixes");
    122.             return *this;
    123.         }
    124.     #endif
    125.      for (k = 0; k < mn; k++)
    126.          result[k] = data[k] + op2[k];
    127.      return result;
    128.  }
    И точка входа sp.cpp
    Код (Text):
    1. #include "mh.h"
    2.  
    3. int main()
    4. {
    5.     matrix<int, int> object(6, 6);
    6.     return 0;
    7. }
    Ну почему выходит вот что:
    Код (Text):
    1. 1>sp.obj : error LNK2019: unresolved external symbol "public: __thiscall matrix<int,int>::~matrix<int,int>(void)" (??1?$matrix@HH@@QAE@XZ) referenced in function _main
    2. 1>sp.obj : error LNK2019: unresolved external symbol "public: __thiscall matrix<int,int>::matrix<int,int>(int,int)" (??0?$matrix@HH@@QAE@HH@Z) referenced in function _main
    3. 1>I:\_______MY_PROJECT\training\Debug\training.exe : fatal error LNK1120: 2 unresolved externals
     
  2. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Очень надеюсь на вашу помощь, пишу БДЗ по сжатию изображений на графах без потерь, так я его написал, сдал, мне дали доп задание, и я решил перелопатить код, чтоб легче было кое-что модицифировать. То, что я кинул выше - маленький кусочек: реализация матрицы. И этот маленький паршивец не линкуется. Кому любопытно, могу весь код выложить.
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    У Вас объявлены (declared), но не определены (defined) конструкторы.
    Напишите код используемых методов, объявленных в заголовочных файлах (ie matrix(matrix &), matrix(int, int), getm(), getn()), и, возможно, всё скомпилируется.
     
  4. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Так, я окончательно затупел, не всё скопировал. Отредактировал первый пост.
     
  5. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Очень прошу помочь, глаз затёрся.
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Шаблоны не поддерживают внешнюю линковку, перенесите все реализации методов в ашник и все будет ок.
     
  7. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    реализация шаблонных методов должна быть видна в точке инстанцирования. короче, надо всё из mh.cpp перенести в mh.h
     
  8. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    sergegers
    Velheart
    Огромное спасибо.