例如这段代码:
#include <vector>
template<typename T>
void useVector(T);
using thing = std::vector<int>;
int main()
{
std::vector<thing> vec;
useVector(vec);
return 0;
}
产生过于冗长的消息:
/home/martin/Projects/TestGrounds/main.cpp:11: error: undefined reference to
`void useVector<std::vector<std::vector<int, std::allocator<int> >,
std::allocator<std::vector<int, std::allocator<int> > > >
>(std::vector<std::vector<int, std::allocator<int> >,
std::allocator<std::vector<int, std::allocator<int> > > >)'
是否有某种方法可以阻止编译器替换所有typedef和默认参数并产生类似的内容:
/home/martin/Projects/TestGrounds/main.cpp:11: error: undefined reference to
void useVector(std::vector<thing>);
答案 0 :(得分:1)
根据Eugen Constantin Dinca的建议,我尝试了gccfilter。
输出错误减少为:
/tmp/ccEixtdl.o: In function `main':
test.cpp:(.text+0x30): undefined reference to `void useVector<>(std::vector<>)'
collect2: error: ld returned 1 exit status
巨大改进。
首先,您需要下载gccfilter perl script并将其放入$ PATH。然后,您必须安装提到的Perl模块。在Ubuntu下我刚刚做了:
cpan App::cpanminus
cpanm Term::ANSIColor
cpanm Getopt::ArgvFile
cpanm Getopt::Long
cpanm Regexp::Common
您可以将原始问题的源代码保存为test.cpp
并运行:
gccfilter --colorize --remove-template-args g++ -std=c++11 test.cpp
如果使用链接器,则必须使用以下命令运行链接器:
gccfilter --colorize --remove-template-args g++
也是。如果您使用的是qmake
,则可以添加:
QMAKE_CXX="gccfilter -c -a g++"
QMAKE_LINK="gccfilter -c -a g++"
到您的.pro
文件。对于QtCreator,这会在问题标签中查看错误消息,但您可以在编译输出标签中查看格式化和简化的错误消息。