【问题标题】:force compiler to reveal type of a variable强制编译器显示变量的类型
【发布时间】:2015-04-02 18:01:07
【问题描述】:

我正在编译一个我面临的相当大的项目

错误:“CRoom room”被重新声明为不同类型的符号

就在

class CRoom
{
.....
} room("test");

问题是我搜索了整个项目文件,但在其他任何地方都找不到这样的变量。是否可以强制编译者告诉我它在哪里找到了这种定义的原始位置?如果不可能,至少,是否可以在 comfile 时显示原始变量的类型(请注意,这个程序有很多其他错误,我无法运行它并显示变量类型。我希望编译器显示类型对我来说)。

【问题讨论】:

  • 另一个room不必是变量,也可以是typedef或函数。假设您使用g++,错误消息应该会告诉您先前声明的位置就在您发布的位下方(“注意:先前声明...”)。
  • @Wintermute 你是对的。这是一个功能。问题是房间被用于不同的图书馆。这就是我找不到它的原因。

标签: c++ c++11 compilation compiler-errors


【解决方案1】:

这可以通过声明一个类模板并让它不实现来轻松完成。

template<typename T>
struct dump;

dump<decltype(room)> d;

这将分别在 gcc 和 clang 上产生以下错误消息

error: aggregate 'dump<CRoom> d' has incomplete type and cannot be defined
error: implicit instantiation of undefined template 'dump<CRoom>'

Live demo

允许程序编译的另一种方法是使用Boost.TypeIndex

#include <boost/type_index.hpp>

std::cout << boost::typeindex::type_id_with_cvr<decltype(room)>().pretty_name() << '\n';

这会在 gcc 和 clang 上产生 CRoom 的输出

Live demo

【讨论】:

    【解决方案2】:

    为了让编译器向我显示某物的类型,我通常使用一个像这样的 improptu 类:

    template <class T>
    struct show_type;
    

    然后,在你需要学习类型的代码中,你会这样做:

    show_type<decltype(room)> t;
    

    编译它,编译器会理所当然地抱怨show_type&lt;T&gt; 没有定义;但错误消息将有助于说明尝试实例化的T

    【讨论】:

    • 为什么还要定义show_type 和使用::typetemplate &lt;class T&gt; struct show_type; show_type&lt;decltype(room)&gt; t;
    • 非常感谢。我意识到可变房间是double,这仍然让我感到困惑。你知道找到它的原始位置吗?
    • @barej 不是来自编译器,但大多数 IDE 都有“转到定义”功能。
    • @barej 或者,既然您知道了类型,即使像 double *room 这样的正则表达式也可能会找到一些东西。
    • @T.C.你是对的,更新了。我的印象是缩短的形式存在一些问题,但我现在似乎无法重现它们。
    猜你喜欢
    • 2017-01-17
    • 2015-10-23
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多