g++ 5.2.1
を使用してこのコードをコンパイルすると、なぜg++ 4.9.3
で失敗しますか?g ++ 5.2.1でコードはコンパイルされますが、g ++ 4.9.3ではコンパイルされません
//exception.h
class MyError: public std::runtime_error
{
public:
using std::runtime_error::runtime_error;
};
// nothing else here
//main.cpp
#include <iostream>
#include "exception.h"
int main() {}
5.2.1
コンパイル:
$ g++ --version
g++ 5.2.1
$ g++ -std=c++11 -c main.cpp -o main.o
$ g++ main.o -o a.out
コンパイル成功し。
4.9.3
コンパイル:
$ g++ --version
g++ 4.9.3
$ g++ -std=c++11 -c main.cpp -o main.o
$ g++ main.o -o a.out
In file included from main.cpp:2:0:
exception.h:3:1: error: expected class-name before ‘{’ token
{
^
exception.h:5:14: error: ‘std::runtime_error’ has not been declared
using std::runtime_error::runtime_error;
....
ソリューションは、今では両方のバージョンで動作します#include <stdexcept>
exception.h
を追加することです。
main.cppから#include <iostream>
を削除すると、5.2.1バージョンでもコンパイルが失敗し、#include <stdexcept>
も必要です。
なぜ5.2.1
バージョンでこのコードが動作するのですか?stdexceptヘッダーは含まれていませんか?
iostream
には5.2.1
バージョンが含まれていますが、4.9.3
バージョンには含まれていませんか?読書GCC changesは役に立ちませんでした。
C++は、ルールに従うと(正しいヘッダーを含める必要があると言う)、何が起こるかを指定します。 C++は、ルールに従わない*ときに何が起こるかを指定しません。したがって、C++はあなたの質問に答えることができず、答えはひどく啓発されません。ちょうど良い規則に従ってください。 –
私は理解できない良い理由があることを期待しました。説明をありがとう。 – Enkelli