C++でカスタム例外を取得しようとしています(Linux、g ++)。 Dictionary.hpp
:C++で独自の例外をスローできません
#include <map>
#include <string>
#include "Dictionary.hpp"
using namespace std;
// map<string, string> dictMap;
Dictionary::Dictionary() {
}
void Dictionary::update(string label, string value) {
dictMap[label]=value;
}
string Dictionary::read(string label){
if (0==dictMap.count(label)) {
throw(EDictionaryNoLabel("label not found"));
}
return dictMap[label];
}
void Dictionary::refresh() {
dictMap.clear();
}
しかし、私はそれをコンパイルすることはできません:
#ifndef HEADER_DICTIONARY_H
#define HEADER_DICTIONARY_H
#include <map>
#include <string>
#include <stdexcept>
using namespace std;
[...]
class EDictionaryNoLabel : public runtime_error
{
public:
explicit EDictionaryNoLabel(const string& __arg);
virtual ~EDictionaryNoLabel() _GLIBCXX_USE_NOEXCEPT;
};
#endif
そしてDictionary.cpp
に、私は例外をスロー(コンパイルが失敗したのはここです)
utils/Dictionary.o: In function `Dictionary::read(std::string)':
Dictionary.cpp:(.text+0xbf): undefined reference to `EDictionaryNoLabel::EDictionaryNoLabel(std::string const&)'
Dictionary.cpp:(.text+0xdc): undefined reference to `EDictionaryNoLabel::~EDictionaryNoLabel()'
Dictionary.cpp:(.text+0xe1): undefined reference to `typeinfo for EDictionaryNoLabel'
/tmp/ccXT7dWk.o:(.gcc_except_table+0x68): undefined reference to `typeinfo for EDictionaryNoLabel'
collect2: error: ld returned 1 exit status
make: *** [Test] Error 1
は、私は私の例外を書きます正確に標準
overflow_error
(これも
runtime_error
から継承)と同じです。
例外のコンストラクタデストラクタの定義はどこですか? –
πάνταῥεthankありがとうございます。 '' 'runtime_error'''から継承したコンストラクタとデストラクタはありませんか?私は特別な振る舞いは必要ありません。新しい例外が必要です。 – LiPo
いいえ、コンストラクタ/デストラクタは実装なしで継承することはできません。クラスごとに一意に指定する必要があります。基本クラスのコンストラクタは、実装のメンバ初期化子リストで指定できます。 –