在编译器认为有效的内容与IDE认为的内容之间存在良好的旧的脱节...在您介绍重复的问题/答案之前,我必须强调在此问题和其他地方可用的所有内容我已经尝试并提炼到此设置:
-std
标志检查日志中的编译器设置发现,它是为C ++ 14正确配置的:
03:51:39 **** Running scanner discovery: CDT GCC Built-in Compiler Settings MinGW ****
g++ -E -P -v -dD C:/dev/eclipse-oxy-cpp/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-6.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw610/x86_64-610-posix-seh-rt_v5/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-isl-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw610/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw610/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw610/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw610/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw610/x86_64-610-posix-seh-rt_v5/mingw64/opt/include -I/c/mingw610/prerequisites/x86_64-zlib-static/include -I/c/mingw610/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -I/c/mingw610/x86_64-610-posix-seh-rt_v5/mingw64/opt/include -I/c/mingw610/prerequisites/x86_64-zlib-static/include -I/c/mingw610/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw610/x86_64-610-posix-seh-rt_v5/mingw64/opt/lib -L/c/mingw610/prerequisites/x86_64-zlib-static/lib -L/c/mingw610/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: posix
gcc version 6.1.0 (x86_64-posix-seh, Built by MinGW-W64 project)
COLLECT_GCC_OPTIONS='-E' '-P' '-v' '-dD' '-shared-libgcc' '-mtune=core2' '-march=nocona'
C:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/6.1.0/cc1plus.exe -E -quiet -v -P -iprefix C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.1.0/ -D_REENTRANT C:/dev/eclipse-oxy-cpp/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C -mtune=core2 -march=nocona -dD
#define __STDC__ 1
#define __cplusplus 201402L
(etc)
下面的片段编译(使用未使用的变量警告,但仍然如此),但是eclipse强调了在test
中解析int main
的问题:
auto test (auto N) {return N;}
int main () {
auto z = test( 3U );
return 0;
}
解析器日志给出:
Unresolved names:
Attempt to use symbol failed: test in file ...
IDE在问题中显示:
Invalid arguments '
Candidates are:
? test(?)
'
对于所有意图和目的,eclipse实际上是看到了正确的gcc二进制文件,并且正在使用正确的c ++标准,但仍然不符合上面的证据编译器(除非我错过了什么?)。
任何想法如何让eclipse表现出语法解析,因为它已经有了正确的c ++标准版本?
我感觉它是索引器而不是解析器的问题,因为它可以搞清楚参数或声明的数量,但似乎无法理解auto
返回类型依赖于自动类型的函数论点。
UPDATE
它可能与this bug(看起来是固定的)和this followup bug(仍在进行中,给出的测试用例类似于我的)相关。
但是,这个版本的test
并没有给我带来任何问题,所以我不确定它是否是同一个bug还是别的...
template< typename T > auto test (T N) {return N;}
函数的参数类型(而不是lambda)中的auto
不是标准的C ++ 14。
它得到了概念TS的支持(由GCC支持> = 6,带有-fconcepts
标志),并且即使没有-fconcepts
作为扩展,也接受GCC> = 4.9,但它不是标准的。 (它可能成为C ++ 20中的标准,以及Concepts TS的其他部分。)
例如,Clang(不支持此扩展)的内容是关于C ++ 14模式下的代码:
test.cpp:1:12: error: 'auto' not allowed in function prototype
auto test (auto N) {return N;}
^~~~
Eclipse CDT目前也没有实现此扩展。我提交了bug 532085来追踪对它的支持;欢迎捐款!