2013-03-10 2 views
0

Вот мой класс ошибок для обработки ошибок с попытаться & улов:C++ - ошибка компиляции с классом ошибки, которые наследуют от станд :: исключение

#include <stdexcept> 
#include <string> 

    class Error : public std::exception 
    { 
    public: 
     Error(const std::string&) throw(); 
     ~Error() throw(); 
     const char* what() const throw(); 
    private: 
     std::string   _msg; 
    }; 

И файл CPP:

#include "Error.hpp" 

Error::Error(const std::string& msg) throw() 
    : _msg(msg) 
{ 
} 

Error::~Error() throw() 
{ 
} 

const char*  Error::what() const throw() 
{ 
    return (_msg.c_str()); 
} 

И У меня есть эти ошибки при компиляции:

main.o:(.gcc_except_table+0x34): undefined reference to `typeinfo for Error' 
MailBox.o: In function `MailBox::MailBox(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': 
MailBox.cpp:(.text+0x245): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x268): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x270): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x2f0): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x313): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x31b): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x3d6): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x3f9): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x401): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x452): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x475): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x47d): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x50a): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x52d): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x535): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x6af): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x6d2): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x6da): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x854): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x877): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x87f): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x923): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x946): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x94e): undefined reference to `typeinfo for Error' 
MailBox.cpp:(.text+0x9b6): undefined reference to `Error::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
MailBox.cpp:(.text+0x9d9): undefined reference to `Error::~Error()' 
MailBox.cpp:(.text+0x9e1): undefined reference to `typeinfo for Error' 
collect2: ld returned 1 exit status 

Я уже использовал этот класс ошибок для anothe r проект, и он работал хорошо. Я не понимаю, почему здесь это не работает.

ответ

3

Это не ошибка компиляции, это компоновщик ошибка. В основном, эта ошибка информирует вас о том, что определение некоторых ваших функций отсутствует.

Чтение с выхода компоновщика, очевидно, что эти функции являются конструкторами копирования и деструктором класса Error.

Это совместимо с тем фактом, что вы показываете только объявление этой функции (в определении класса для Error). Вы также должны указать для определения. Например, вы можете просто вставить эти определения:

class Error : public std::exception 
{ 
public: 
    Error(const std::string& s) throw() : _msg(s) { } 
    ~Error() throw() { }; 
    const char* what() const throw() { return _msg.c_str(); }; 
private: 
    std::string _msg; 
}; 
+0

Но у меня уже есть файл Error.cpp с этим кодом. – Elfayer

+0

Смотрите, я редактировал свое сообщение. – Elfayer

+2

@Elfayer: тогда файл 'Error.cpp' не обрабатывается компилятором каким-то образом. Проверьте настройки проекта и убедитесь, что файл не исключен из сборки. Кроме того, чтобы убедиться, что это проблема, попробуйте вставить эти определения функций, как я предложил. Если это работает, проблема в том, что 'Error.cpp' не обрабатывается. –