我最近花了一些时间寻找我的 C++ 模板中的拼写错误。 g++ 没有提示打字错误,所以我想知道将来是否有可以检查此类问题的工具?
这是一个演示正确编译的简化示例。我预计会收到关于未定义 struct dummy 的投诉,但似乎模板化类 goo 隐藏了这一点。
foo.h:
struct smart {
int x, y, z;
};
template<typename T> class goo
{
void barf(T* ptr){}
};
template<typename T> class foo
{
public:
foo(){};
private:
goo<T> x;
};
class bar: public foo<struct dummy>
{
public:
void do_something(struct smart& thing){}
};
foo.cpp:
#include "foo.h"
int main()
{
bar a;
struct smart b;
a.do_something(b);
return b.x+b.y+b.z;
}
使用 g++ foo.cpp 编译成功
最佳答案
设置为最高警告级别的编译器是检测任何 C++ 问题的最佳工具。
我给你的建议有两点:
1) 将编译器警告级别设置为最高级别。这将捕获许多较低级别可能保持沉默的错误。
2) 当你做错事时,使用更容易产生编译器错误的编码风格。例如:
class bar: public foo<struct dummy>
{
public:
void do_something(struct smart& thing){}
};
老实说,我不知道这段代码是否合法。我强烈怀疑不是,但看起来您正在声明一个新类型 struct dummy
。编译器接受它,所以我不确定它是否合法。
如果这样做,您会得到很好的服务:
class bar: public foo<dummy>
{
public:
void do_something(struct smart& thing){}
};
现在这永远不能被解析为新的类型声明,编译器将拒绝它。这会及早发现您的问题。
关于c++ - 检测 C++ 模板问题的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606251/