c++ - 检测 C++ 模板问题的工具

标签 c++ templates g++ static-analysis

我最近花了一些时间寻找我的 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/

相关文章:

c++ - 从我的 mac 上的文件将 g++ 安装到终端

c++ - 将另一个类的 C++ 静态函数绑定(bind)到 Lua

c++ - Qt 应用程序 : How to create standalone executable file for Windows (& Mac) from Mac?

python - DFS中c++和Python的区别

c++ - 使用 boost::asio 发送 http GET 请求,类似于 cURL

javascript - 如何使用 Tempo.js 进行 JSON 模板化?

c++ - 类模板和多参数包的模板参数推导

c++ - 在它自己的指针上模板化一个类?

c++ - 在 C++ 结构中显示垃圾值

c++ - 从 C++ 静态库中删除除 API 之外的所有内容?