Ошибка с перегрузкой оператора C ++, в Visual Studio и Xcode - PullRequest
1 голос
/ 07 июля 2010

Я работаю над присваиванием C ++ для класса, который хочет, чтобы я перегрузил оператор ">>".Я сталкиваюсь с ошибками, связывающими и в Visual Studio 2005 и в Xcode 3.2.2.Код C ++ разделен на несколько файлов.Прототипы хранятся в файле overload.h, реализации хранятся в файле overload.cpp, а main() - в файле overloadtester.cpp (хотя я еще не смог поместить что-либо, связанное с этим новым перегруженным оператором, в main из-за ошибкиниже приведен код, который я добавил до того, как начал получать ошибки (перечислены ниже)

// 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 для получения дополнительной информации о input ()

Ответы [ 4 ]

1 голос
/ 07 июля 2010

Ошибка неопределенный символ - ошибка компоновщика.Это означает, что когда вы связываете весь свой код в один исполняемый файл / библиотеку, компоновщик не может найти определение функции.Основными двумя причинами этого являются забвение включения скомпилированного объекта в библиотеку / исполняемый файл или ошибка при определении функции (скажем, вы объявляете void f( int & );, но реализуете void f( const int & ) {}).

Я не знаюЯ не знаю ваших IDE (я никогда не понимал Xcode), но вы можете попытаться скомпилировать из командной строки: g++ -o exe input1.cpp input2.cpp input3.cpp ...

1 голос
/ 07 июля 2010

Вы неправильно связываетесь в overload.cpp. Убедитесь, что overload.cpp является участником файла вашего проекта в обоих случаях.

0 голосов
/ 07 июля 2010

Вы не добавили файлы в свой проект правильно, поэтому компилятор не создает его, а компоновщик не связывает его.

Причина, по которой я могу сказать, состоит в том, что вы опубликовали неверный код, который не будеткомпиляции.Если бы вы добавили его в свой проект, компилятор не работал бы, и вы бы никогда не добрались до шага связывания.

В Visual Studio вы можете добавить существующий файл в ваш проект в меню Project в разделеAdd Existing Item...

0 голосов
/ 07 июля 2010

Если перегрузка является классом шаблона, источник для оператора должен находиться в заголовке.

Кроме того, имена должны быть полностью квалифицированными. То есть, если у вас есть статические члены пространства имен / класса, к ним должно быть применено полное определение при определении реализации члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...