Я работаю над присвоением C++ для класса, который хочет, чтобы я перегрузился">>" оператор. Я встречаюсь с ошибками, связывающимися и в Visual Studio 2005 и в XCode 3.2.2. Код C++ разделен на несколько файлов. Прототипы хранятся в overload.h, реализации хранятся в overload.cpp, и main()
находится в overloadtester.cpp (хотя я не смог поместить что-либо связанное с этим новым перегруженным оператором в основном все же из-за ошибки. ниже код, который я добавил, прежде чем я начал получать (упомянутые ниже) ошибки
// overload.h
// Class Name OverloadClass
#ifndef _OverloadClass_H
#define _OverloadClass_H
#include < string >
using namespace std ;
class OverloadClass
{
public:
// Constructors and methods
private:
x_;
y_;
};
istream& operator>> (istream& in, OverloadClass &p);
#endif
// overload.cpp
#include < iostream >
#include < string >
#include < sstream >
#include < istream >
extern "C"
{
#include "DUPoint.h"
}
using namespace std ;
void OverloadClass::input()
{
char leftParen;
char comma ;
cin >> leftParen >> x_ >> comma;
char rightParen;
cin >> y_ >> rightParen;
}
// Constructor and method implementations
istream& operator>> (istream& in, OverloadClass &p)
{
p.input();
return in;
}
Ошибка я входил в XCode:
Link ./OverloadDirectory Undefined symbols: "operator>>(std:basic_istream >&, OverloadClass&)" referenced from: _main in overloadtester.o ld: symbol(s) not found collect2: ld returned 1 exit status
У меня нет доступа к компьютеру с VS в тот самый момент, надо надеяться, когда я делаю я могу отправить ошибку, которую я получаю от выполнения кода того IDE.
Отредактированный в ответ на запрос @Mark на большее количество деталей
Отредактированный в ответ на запрос @sbi на большее количество информации о входе ()
Ошибка неопределенный символ является ошибкой компоновщика. Это означает, что когда вы связываете весь свой код в один исполняемый файл / библиотеку, компоновщик не может найти определение функции. Две основные причины этого - это забыть включить скомпилированный объект в библиотеку / исполняемый файл или ошибка при определении функции (скажем, вы объявляете void f (int &);
, но реализуете void f (const int &) {}
).
Я не знаю ваших IDE (я никогда толком не разбирался в Xcode), но вы можете попробовать скомпилировать из командной строки: g ++ -o exe input1.cpp input2.cpp input3.cpp ...
Вы неправильно связываете overload.cpp. Убедитесь, что overload.cpp является частью вашего файла проекта в обоих случаях.
Вы неправильно добавили файлы в свой проект, поэтому компилятор не собирает его, а компоновщик не связывает его.
Причина, по которой я могу сказать, заключается в том, что вы опубликовали недопустимый код, который не будет компилироваться. Если бы вы добавили его в свой проект, компилятор потерпел бы неудачу, и вы бы никогда не добрались до этапа компоновки.
В Visual Studio, Вы можете добавить существующий файл в проект в меню Project
в разделе Добавить существующий элемент...
Если перегрузка является классом шаблона, источник оператора должен находиться в заголовке.
Кроме того, имена должны быть полностью квалифицированы. То есть, если у вас есть какие-либо статические члены пространства имен/класса, к ним должно быть применено полное определение при определении реализации элемента.