强制编译器显示变量的类型

force compiler to reveal type of a variable

我正在编译一个相当大的项目,我在其中遇到了

error: ‘CRoom room’ redeclared as different kind of symbol

就在

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

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

为了让编译器向我显示某物的类型,我通常会即兴使用 class,如下所示:

template <class T>
struct show_type;

然后,在需要学习类型的代码中,您可以这样做:

show_type<decltype(room)> t;

编译它,编译器会正确地抱怨 show_type<T> 没有定义;但错误消息将有助于拼出尝试实例化的 T

这可以通过声明一个 class 模板并保持未实现来轻松完成。

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