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

Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ - C++

Восстановить пароль Регистрация
 
_Kate_
0 / 0 / 0
Регистрация: 12.09.2012
Сообщений: 92
Записей в блоге: 1
02.10.2013, 20:37     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #1
Получено следующую ошибку в результате компилирование.
Возможно у меня проблема возникла с проэктом прошу скомпилировать, для начала, спасибо.
Ошибка 10 error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl operator-(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??G@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V01@0@Z) в функции "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl operator+(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??H@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V01@0@Z) C:\Users\Катя\documents\visual studio 2012\Projects\test\Addition.obj

Реализация длинной арифметики
определение класса: longclass.h
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
    #include <iostream>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <windows.h>
#include <sstream>
#include <math.h>
#include <locale.h>
using namespace std;
 
class verylong
{
    int count1;
    int count2;
    string number1;
    string number2;
    int base;
    bool minus1;
    bool minus2;
public:
    verylong(void)
    {
    base=10;
    minus1=false;
    minus2=false;
    }
 
    int input(string digit1, string digit2) {   //анализатор строки
    int i;
    char tmp;
      if (digit1[0] == '-') {
          for (i=0; i<digit1.size()-1; i++) {
            number1+=digit1[i+1];
          }
       minus1=true;
       count1=digit1.size()-1;
       } else {
         number1=digit1;
         count1=digit1.size();
         }
       for (i=0; i<count1/2; i++) {
           tmp=number1[i];
           number1[i]=number1[(count1-1)-i];
           number1[(count1-1)-i]=tmp;
       }
 
    if (digit2[0] == '-') {
          for (i=0; i<digit2.size()-1; i++) {
            number2+=digit2[i+1];
          }
    minus2=true;
    count2=digit2.size()-1;
    } else {
     number2=digit2;
     count2=digit2.size();
     }
   for (i=0; i<count2/2; i++) {
       tmp=number2[i];
       number2[i]=number2[(count2-1)-i];
       number2[(count2-1)-i]=tmp;
   }
       digit1.clear();
       digit2.clear();
    return 0;
    }
 
    string reverse(string number) {
        double size=number.size(), i;
        char sym;
        for (i=0; i<size/2; i++) {
            sym=number[i];
            number[i]=number[(size-1)-i];
            number[(size-1)-i]=sym;
        }
    return number;
    }
    
    friend string operator+(const string sum1, const string sum2);
    friend string operator% (const string num1, const string num2);
 
 
 
 
    
 
    
    ~verylong(void)
    {
        number1.clear();
        number2.clear();
        minus1=false;
        minus2=false;
    }
};
Реализация функции суммирования:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <math.h>
#include <string>
#include "StdAfx.h"
#include "longclass.h"
 
 
string operator+(const string sum1, const string sum2) {
    verylong TEMP;
    int i=0, carry=0, max=0, dif;
    string result, temp;
    bool flag=false;
    TEMP.input(sum1, sum2);
    result.clear();
    char sym;
    if (TEMP.count2>TEMP.count1) {
        result=TEMP.number1;
        TEMP.number1.clear();
        TEMP.number1=TEMP.number2;
        TEMP.number2.clear();
        TEMP.number2=result;
        result.clear();
        dif=TEMP.count1;
        TEMP.count1=TEMP.count2;
        TEMP.count2=dif;
        dif=0;
        flag=true;
    }
    if (TEMP.count2==TEMP.count1) {
        for (i=TEMP.count1-1; i>=0; i--) {
            if (int(TEMP.number1[i])<int(TEMP.number2[i])) {
                string temp;
                temp=TEMP.number2;
                TEMP.number2.clear();
                TEMP.number2=TEMP.number1;
                TEMP.number1.clear();
                TEMP.number1=temp;
                temp.clear();
                i=-1;
                flag=true;
            }
        }
    }
 
//если оба положительные
if ((TEMP.minus1==false && TEMP.minus2==false) || (TEMP.minus1==true && TEMP.minus2==true)) {
    if (TEMP.count1>TEMP.count2 || TEMP.count1==TEMP.count2) {
       dif=TEMP.count1-TEMP.count2;
       max=TEMP.count2;
    }
    for (i=0; i<max; i++) {
    result+=char(((int(TEMP.number1[i])-48)+((int(TEMP.number2[i])-48)+carry))%TEMP.base)+48;
    if (((int(TEMP.number1[i])-48)+(int(TEMP.number2[i]-48))+carry)>TEMP.base-1) {
    carry=1;
    } else
        carry=0;
    }
    if (TEMP.count1 != TEMP.count2) {
    for (i=max; i<TEMP.count1; i++) {
       if (TEMP.count1>TEMP.count2) {
           result+=char((int(TEMP.number1[i])-48+carry)%TEMP.base)+48;
           if ((int(TEMP.number1[i])-48+carry)>TEMP.base-1) {
           carry=1;
           } else
               carry=0;
       }
    }
    }
    if (carry==1) {
        result+=char(carry)+48;
    }
    carry=result.size();
    for (i=0; i<carry/2; i++) {
        sym=result[i];
        result[i]=result[(carry-1)-i];
        result[(carry-1)-i]=sym;
    }
}
if (TEMP.minus1==false && TEMP.minus2==false) {
   if (result.size()==0) {
      result+="0";
   }
   return result;
}
//если minus1=true и minus2=true
if (TEMP.minus1==true && TEMP.minus2==true) {
    temp=result;
    result.clear();
    result+="-";
    result+=temp;
    if (result.size()==0) {
      result+="0";
   }
   return result;
}
 
temp.clear();
if (TEMP.minus1==false && TEMP.minus2==true) {
//если number1>=number2
   if (!flag) {
   TEMP.minus1=false;
   TEMP.minus2=false;
   TEMP.number1=TEMP.reverse(TEMP.number1);
   TEMP.number2=TEMP.reverse(TEMP.number2);
   result=TEMP.number1-TEMP.number2;
   if (result.size()==0) {
      result+="0";
   }
   return result;
   } else {
     //иначе
    result.clear();
    TEMP.minus1=false;
    TEMP.minus2=false;
    TEMP.number1=TEMP.reverse(TEMP.number1);
    TEMP.number2=TEMP.reverse(TEMP.number2);
    temp=TEMP.number1-TEMP.number2;
    result+="-";
    result+=temp;
    if (result.size()==0) {
      result+="0";
   }
   return result;
   }
}
 
if (TEMP.minus1==true && TEMP.minus2==false) {
//если number1>=number2
   if (!flag) {
   result.clear();
   TEMP.minus1=false;
   TEMP.minus2=false;
   TEMP.number1=TEMP.reverse(TEMP.number1);
   TEMP.number2=TEMP.reverse(TEMP.number2);
   temp=TEMP.number1-TEMP.number2;
   if (temp[0]=='0' && temp.size()==1) { //если 0
       return temp;
   }
   result+="-";
   result+=temp;
   i=0, carry=0, max=0;
   flag=false;
   if (result.size()==0) {
      result+="0";
   }
   return result;
   } else {
   //иначе
     TEMP.minus1=false;
     TEMP.minus2=false;
     TEMP.number1=TEMP.reverse(TEMP.number1);
     TEMP.number2=TEMP.reverse(TEMP.number2);
     result=TEMP.number1-TEMP.number2;
     i=0, carry=0, max=0;
         flag=false;
         if (result.size()==0) {
         result+="0";
         }
     return result;
     }
}
}
main function :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 #include "StdAfx.h"
#include <string>
#include <math.h>
#include "longclass.h"
#include <conio.h>
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    verylong temp;
    int n, m;
    char sym='и';
    string module, key;
    string a="12233252", b="-2424";
    cout << a+b << endl;
 
    system("pause");
    return 0;
}
stadafx.h

C++
1
2
3
4
#include "targetever.h"
 
#include <stdio.h>
#include <tchar.h>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 20:37     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ
Посмотрите здесь:

Не могу разобраться где ошибка!error LNK2019: ссылка на неразрешенный внешний символ C++
C++ Ошибка - ссылка на неразрешенный внешний символ
C++ Ошибка линковки: ссылка на неразрешенный внешний символ
C++ error LNK2019: ссылка на неразрешенный внешний символ(не могу исправить ошибку)
Ошибка линковщика LNK2019: ссылка на неразрешенный внешний символ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
02.10.2013, 21:06     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #2
C++
1
temp=TEMP.number1-TEMP.number2;
Вычитание строк? Забавно.

P.S. Это и есть ошибка.
_Kate_
0 / 0 / 0
Регистрация: 12.09.2012
Сообщений: 92
Записей в блоге: 1
02.10.2013, 21:13  [ТС]     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #3
ем там должна была быть длина (count)...
ем каким образом вы определили ошибку, просто перебор кода или студия указывает вам строку где ошибка ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,843
Записей в блоге: 2
Завершенные тесты: 1
02.10.2013, 21:18     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #4
Цитата Сообщение от _Kate_ Посмотреть сообщение
ем каким образом вы определили ошибку, просто перебор кода или студия указывает вам строку где ошибка ?
Вам же пишут:
Ошибка 10 error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl operator-(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??G@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator @D@2@@std@@V01@0@Z) в функции "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl operator+(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??H@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator @D@2@@std@@V01@0@Z) C:\Users\Катя\documents\visual studio 2012\Projects\test\Addition.obj
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
02.10.2013, 21:38     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Вам же пишут:
еще бы понять что там написано))
_Kate_
0 / 0 / 0
Регистрация: 12.09.2012
Сообщений: 92
Записей в блоге: 1
02.10.2013, 21:43  [ТС]     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #6
вот именно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2013, 22:02     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ
Еще ссылки по теме:

C++ Ошибка компоновщика: ссылка на неразрешенный внешний символ
Ошибка: ссылка на неразрешенный внешний символ C++
C++ Ошибка LNK2019: ссылка на неразрешенный внешний символ

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

Или воспользуйтесь поиском по форуму:
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
02.10.2013, 22:02     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ #7
Вандевурд Д., Джосаттис Н.М. - Шаблоны C++(2003)

6.6.1. Дешифровка ошибок-романов

Текст обычных сообщений об ошибках компиляции, как правило, является
лаконичным и отражающим суть ошибки. Например, когда компилятор говорит "class X has
no member ' fun'" (в классе X отсутствует член "fun"), то обычно не составляет
труда определить, что именно неверно в вашем коде (например, вы ошибочно ввели "run"
вместо "fun"). В случае шаблонов это не так. Рассмотрим относительно простой
фрагмент кода, в котором задействована стандартная библиотека C++. Он содержит
небольшую ошибку: используется list<string>, но поиск проводится с помощью объекта-
функции greater<int>, а не greater<string>:


std::list<std::string> coll

// Поиск первого элемента, большего "А"
std::list<std::string>::iterator pos;
pos = std::find_if(
coll.begin(),coll.end(), // Диапазон поиска
std::bind2nd(std::greater<int>(),"A"));// Критерий поиска
Такого рода ошибки часто случаются, когда программист вырезает и вставляет код,
но забывает внести в него необходимые изменения.
Одна из версий популярного компилятора GNU C++ выдает при этом приведенное
ниже сообщение об ошибке.



/local/include/stl/_algo.h: In function 'struct _STL::_Lis
t_iterator<_STL::basic_string<char,_STL::char_traits<char>/
__STL: :allocator<char> >,_STL: :_Nonconst__traits<_.STL: :basic_
string<char,_STL::char_traits<char>,_STL::allocator<char> >
> >_STL::find_if<_STL:: _List_.it era tor<_STL::basic_string<c
har,_STL::char_traits<char>,_STL::allocator<char> >,_STL::_
Nonconst_traits<_STL: :basic_string<char,_STL: : char_.traits<c
har>,_.STL: :allocator<char> > > >, _STL: :binder2nd<_STL: :gre
ater<int> > > (_STL: :_List_iterator<_.STL: :basic_string<char,
_STL::char_traits<char>,_STL::allocator<char> >,_STL::_Nonc
onst_traits<_STL::basic_string<char,_STL::char_traits<char>
,_STL::allocator<char> > > >,_STL::_List_iterator<_STL::bas
ic_string<char,_STL::char_traits<char>,_.STL::allocator<char
> >,_STL::_Nonconst_.traits<_.STL::basic_string<char,_STL::ch
ar_.traits<char>,_JSTL: :allocator<char> > > >,_STL::birider2nd
<_STL: :greater<int> >/__STL: : input_.it erator_tag) ' :/local/inc
lude/stl/_algo.h:115: instantiated from '_STL::find_if<_STL
::_List_Iterator<_.STL::basic_string<char,_STL::char_traits<i
char>,_STL::allocator<char> >,_STL::_.Nonconst_.traits<_STL::
basic_string<char,_STL::char_.traits<char>,_.STL::allocator<c
har> > > >, _STL::binder2nd<_STL::greater<int> > >(_STL::_L
ist_iterator<_STL: :basic_string<char,_STL: : char_.traits<char
>,_STL: :allocator<char> >,_STL: :Nonconst_traits<_STL: -.basic
_string<char,_STL::char_traits<char>,_STL:: allocator<char>
> > >,_STL::List_iterator<STL::basic_string<char,_STL::cha
r_traits<char>,_STL:: allocator<char> >,_STL::_Nonconst_tra
its<_STL::basic_string<char,_STL::char_traits<char>,_.STL::a
llocator<char> > > >_STL::binder2nd<_STL::greater<int> >)'t
estprog.cpp:18: instantiated from here/local/include/stl/_a
lgo.h:78: no match for call to •(_STL::binder2nd<_STL::grea
ter<int> >) (_STL::basic_string<char,_STL::char_traits<char
>,_STL::allocator<char> > &)¦/local/include/stl/_function.h
:261: candidates are: bool _STL::binder2nd<_STL::greater<in
t> >::operator ()(const int &) const




Такое сообщение на первый взгляд больше смахивает на роман, чем на
диагностическое сообщение, и одним своим видом способно полностью деморализовать новичков в
области шаблонов. Однако сообщения, подобные приведенному, при наличии некоторой
практики поддаются пониманию, и местонахождение ошибок можно легко определить.
В первой части нашего сообщения говорится, что ошибка произошла в экземпляре
шаблона функции (с ужасно длинным именем), запрятанном глубоко внутри
заголовочного файла / local /include/st 1 /_algo .h. Далее компилятор сообщает, почему он
сгенерировал этот конкретный экземпляр шаблона. В данном случае "отсчет" начинается
со строки 18 файла testprog.cpp (это файл, содержащий код нашего примера), в
которой вызывается генерация экземпляра шаблона f ind_if из строки 115 заголовочного
файла _algo. h. Компилятор сообщает все это для того, чтобы вы знали, что такие-то
экземпляры шаблонов сгенерированы, и смогли восстановить цепочку событий, которые
вызвали генерацию экземпляров шаблона.

Однако в случае нашего примера есть основания полагать, что должны быть инстанциро-
ваны все шаблоны. Но почему же тогда программа не работает? Ответ на этот вопрос
содержится в последней части сообщения, там, где говорится "no match for call" — это
означает, что вызов функции не может быть сгенерирован из-за несоответствия типов
аргументов и параметров. Более того, сразу же за этим в строке, содержащей "candidates are",
поясняется, что единственным типом-кандидатом является целочисленный тип (тип
параметра— const int&). Вернувшись назад, к строке 18, вы увидите std: :bind2nd
(std: :greater<int>(), "A") — строка действительно содержит целочисленный тип
(int), а он несовместим с объектами строкового типа, поиск которых проводится в нашем
>- примере. Стоит заменить <int> на std:: string — и проблема будет решена.
Нет сомнений в том, что сообщение об ошибке можно было структурировать получше.
Ничто не мешает опустить описание проблемы перед историей инстанцирования шаблонов,
а вместо развернутых имен наподобие "MyTemplate<YourTemplate<int> >"
выводить структурированные описания, например "MyTemplate<T>", где
Т = YourTemplate<int>, чтобы сократить чрезмерно длинные имена. Однако
нельзя отрицать и то, что вся информация в этом диагностическом сообщении в
некоторых ситуациях может оказаться весьма полезной. Поэтому не стоит удивляться
тому, что аналогичную информацию выдают и другие компиляторы (хотя в некоторых
из них используется упомянутая выше структуризация).
Yandex
Объявления
02.10.2013, 22:02     Не могу скомпилировать ошибка, ссылка на неразрешенный внешний символ
Ответ Создать тему
Опции темы

Текущее время: 08:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru