png++ 无效的模板参数 Eclipse 编辑器 Cygwin 符号 link

png++ invalid template arguments Eclipse editor Cygwin symbolic link

我正在尝试使用 Eclipse CDT with the Cygwin GCC 工具链,以便使用 png++ 读取一些图像。我已经在我的 Cygwin 中安装了 png++ headers(我尝试了 0.2.5 和 0.2.7),并且使用 make 的外部构建器设置编译得很好,但由于某种原因,编辑器在 "image" 下划线来自 png::image 中非常简单的代码:

#include <png++/png.hpp>

int main( int argc, char* argv[]){
    png::image<png::gray_pixel> t(128,128);
    return 1;
}

并给出错误:

Invalid template arguments.

我四处寻找这个错误,对其他人来说似乎是由于没有将 GCC 设置为使用 C++11(例如 Invalid template arguments on map std::map< std::string, Stock*> &stocks)引起的,但我不认为对我来说是个问题,因为我将 "CDT GCC Built-in Compiler Settings Cygwin" 提供程序命令设置为:

${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}"

std::normal_distribution<double> distribution(5.0,2.0);行没有报错

我可以通过在项目属性 -> C/C++ General -> 下关闭 "Invalid template argument" 来删除错误下划线代码分析,但问题比这更深,因为 auto-completes 的 none 将适用于 png::image 类型的 object,如果我尝试并在函数中使用它,例如:

void pngTest(png::image<png::gray_pixel> im, int other) {}

它给出错误:Invalid arguments ' Candidates are: void pngTest(?, int) '

所以它似乎根本没有解析类型。可能是什么原因造成的?

原来这实际上不是 Eclipse 解析的错误,而是与 Cygwin 样式符号链接的不兼容。在 png++ 的 png.hpptypes.hpp 中,它包括来自 libpng 的 png.h,但在 Cygwin png.h(在 /usr/include 中)是一个 Cygwin 风格的符号链接到当前的 libpng(在我的情况是文件包含文本:!<symlink>libpng16/png.h)。

因此 Eclipse 无法解析此包含,即使 Cygwin 的 GCC 可以,并且它使 types.hpp 中的 typedef 无法正确解析。这就是为什么我在 eclipse 中收到 invalid template arguments 错误,png::gray_pixel 不是有效类型。当我改用 <int> 并且它不再给出错误时,我注意到了这一点。这就是问题所在。

我在 png.hpptypes.hpp

中将包含路径从 png.h 更改为 libpng16/png.h

现在,在右键单击项目后,eclipse 中的所有内容都可以正确解析 -> index -> rebuild。或者,您可以使用 windows mklink 命令将 /usr/include 中的 png.hpngconf.hpnglibconf.h 符号链接到适当的 libpng 子文件夹,并删除 Cygwin 样式符号链接。

如果有人知道 Eclipse 与 Cygwin 符号链接无缝工作的方法,那么 post 在这里我会接受它作为答案,因为显然这比这个 hacky 修复好一点。

谢谢大家的评论,但幸好这次不是 Eclipse 的问题。