2016-04-07 18 views
-1

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は役に立ちませんでした。

+4

C++は、ルールに従うと(正しいヘッダーを含める必要があると言う)、何が起こるかを指定します。 C++は、ルールに従わない*ときに何が起こるかを指定しません。したがって、C++はあなたの質問に答えることができず、答えはひどく啓発されません。ちょうど良い規則に従ってください。 –

+0

私は理解できない良い理由があることを期待しました。説明をありがとう。 – Enkelli

答えて

2

標準ライブラリヘッダーには他のヘッダーを含めることができますが、保証はありません。

g ++ 4.0と4.1の古代の頃、#include <iostream>#include <deque>を使って標準ライブラリのほとんどを引き出すことができました。しかし、それはバージョン4.3(またはそのようなもの)で動作しなくなりました。

コードを移植するには、必要なすべてのヘッダを明示的に含める必要があります。

+3

"ただし、保証はありません" - [いくつかの例外を除いて](http://stackoverflow.com/questions/26614983/which-headers-in-the-c-standard-library-are-guaranteed-to-include-別のヘッド)。 –

関連する問題