强制编译器显示变量的类型
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>'
另一种允许程序编译的方法是使用 Boost.TypeIndex
#include <boost/type_index.hpp>
std::cout << boost::typeindex::type_id_with_cvr<decltype(room)>().pretty_name() << '\n';
这会在 gcc 和 clang
上产生输出 CRoom
我正在编译一个相当大的项目,我在其中遇到了
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>'
另一种允许程序编译的方法是使用 Boost.TypeIndex
#include <boost/type_index.hpp>
std::cout << boost::typeindex::type_id_with_cvr<decltype(room)>().pretty_name() << '\n';
这会在 gcc 和 clang
上产生输出CRoom