我在做家庭作业时注意到我的笔记本电脑上的编译器比我们希望用于提交的计算机上的编译器容许得多。我笔记本电脑上的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
。没有错误,没有警告,什么都没有。在提交框中,我并不那么幸运。
/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);
^
这些错误是有意义的,因为我不包括tuple
头,但我不明白为什么这个代码编译在所有我的笔记本电脑。这里发生了什么?
AppleClang的标题可能间接包含或std :: tuple定义的其他来源。你必须看看标题才能确定。 –
非可移植代码的问题在于它是......好吧,你能猜到吗? –