ラップトップのコンパイラは、私たちが提出するために使用することが期待されているマシン上のコンパイラよりもはるかに許容性が高いという宿題に取り組んでいることに気付きました。私のラップトップのC++コンパイラはAppleClang 7.0.2.7000181
で、提出ボックスのコンパイラはg++ 4.9.2
です。振り返ってみると、コンパイルべきではない、コードは、次のとおりです。なぜこのC++コードはいくつかのコンパイラでコンパイルされますが、他のコンパイラではコンパイルされません。
#include <iostream>
std::tuple<int, int> foo() {
return std::make_tuple(1, 1);
}
int main() {
auto pair = foo();
int x = std::get<0>(pair);
int y = std::get<1>(pair);
std::cout << x << "," << y << std::endl;
return 0;
}
私はまた、CMakeLists.txtを持っている:私のラップトップ上で
cmake_minimum_required(VERSION 2.8)
project(foo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Werror -Werror=sign-compare")
set(SOURCE_FILES main.cpp)
add_executable(foo ${SOURCE_FILES})
を、クランは喜んでこのコードをコンパイルし、1,1
を出力します。エラーなし、警告なし、何もありません。投稿箱に、私はとても幸運ではない。私はtuple
ヘッダを含めていないんだけど、このコードは私のラップトップ上でのすべてのコンパイルなぜ私は理解していないので、
/home/nate/foo/main.cpp: In function 'std::tuple<int, int> foo()':
/home/nate/foo/main.cpp:3:26: error: return type 'class std::tuple<int, int>' is incomplete
std::tuple<int, int> foo() {
^
/home/nate/foo/main.cpp:4:12: error: 'make_tuple' is not a member of 'std'
return std::make_tuple(1, 1);
^
/home/nate/foo/main.cpp: In function 'int main()':
/home/nate/foo/main.cpp:8:21: error: 'void pair' has incomplete type
auto pair = foo();
^
/home/nate/foo/main.cpp:9:13: error: 'get' is not a member of 'std'
int x = std::get<0>(pair);
^
/home/nate/foo/main.cpp:10:13: error: 'get' is not a member of 'std'
int y = std::get<1>(pair);
^
これらのエラーは、意味をなさない。何が起きてる?
AppleClangのヘッダーには、間接的になどのstd :: tupleの定義のソースが含まれている場合があります。あなたは確かに知るためにヘッダーを見る必要があります。 –
移植性のないコードの問題は、それは...まあ、あなたが推測できますか? –