Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yuriillusion
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 9
#1

Перегрузка операторов шаблонного класса дружественными функциями - C++

27.03.2014, 19:08. Просмотров 474. Ответов 1
Метки нет (Все метки)

При попытке скомпилировать проект выдаются следующие ошибки:

Error 1: error LNK2019: unresolved external symbol "class matrix<int> __cdecl operator+(class matrix<int> &,class matrix<int> &)" (??H@YA?AV?$matrix@H@@AAV0@0@Z) referenced in function _main

Error 2: error LNK1120: 1 unresolved externals

В исходном проекте также были внутренние методы класса - они стабильно работали. Все friend функции, описанные нижеприведённым способом, приводили к таким же ошибкам.

Почему возникают такие ошибки и как разрешить проблему?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
template <class T>
class matrix
{
    T** mtr;
public:
    int size;
    matrix(int _size);
    friend matrix operator + (matrix &m1, matrix &m2);
    T* operator [] (int adress);    
};
template <class T> matrix <T> ::matrix(int _size)
{
    size=_size;
    mtr=new T*[size];
    for(int i=0; i<size; i++)
        *(mtr+i)=new T[size];
    for(int i=0; i<size; i++)
        for(int j=0; j<size; j++)
        {
            mtr[i][j]=static_cast<T>(0);
        }
}
template <class T> T* matrix <T> :: operator [] (int adress)
{
    return mtr[adress];
}
template <class T> matrix <T> operator + (matrix <T> &m1, matrix <T> &m2)      //Не работает
{
    if(m1.size!=m2.size)
    {
        //throw (BadSize());
        matrix <T> B(1);
        return B;
    }
    int sz=m1.size;
    matrix <T> A(sz);
    for(int i=0; i<sz; i++)
        for(int j=i; j<sz; j++)
            A[i][j]=m1[i][j]+m2[i][j];
    return A;
}
int main()
{
    matrix <int> A(3);
    matrix <int> B(3);
    A+B;
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 19:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов шаблонного класса дружественными функциями (C++):

Не работает перегрузка операторов шаблонного класса - C++
помогите кто может разобрать что не работает( в понедельник екзамен, а я так туплю... все ошибки и код прилагаются Error 1 error...

Перегрузка оператора << шаблонного класса - C++
Всем доброго времени суток! Целый день бьюсь над перегрузкой оператора &lt;&lt; в шаблонном классе одномерный массив. Пока получилось родить...

Перегрузка << , >> для шаблонного класса - C++
Доброго времени суток всем! Данная тема не раз подымалась на форуме.. Но есть но.. Помогите перегрузить операторы побитового сдвига для...

Перегрузка operator<< для шаблонного класса - C++
Добрый день не могу понять как реализовать перегрузку &lt;&lt; для шаблонного класса template &lt;class T&gt; class List { public: ...

Перегрузка оператора -> для шаблонного класса - C++
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: template&lt;class...

Перегрузка оператора шаблонного класса в зависимости от типа - C++
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
27.03.2014, 19:35 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Объявление оператора дружественным надо делать полным, как шапка при определении.

C++
1
template<class T> friend matrix<T> operator+ (matrix<T> &m1, matrix<T> &m2);
А вообще у Липпмана советовали определять как член класса паблик оператор составного +, и оператор+ перегружать с его использованием.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 19:35
Привет! Вот еще темы с ответами:

Перегрузка оператора вывода на консоль для шаблонного класса - C++
Следующий код компилируется, но не линкуется: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; class A { ...

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода) - C++
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template &lt;class Element&gt; class List { ...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Перегрузка операторов класса - C++
Господа, сразу перейду к делу. Написал класс, но не могу перегрузить операторы &quot;&gt;&gt;&quot; и &quot;+&quot;. Не подскажете, что я делаю не так? Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru