如何在编译时调试模板参数

How to debug template arguments at compile-time?

本文关键字:参数 调试 编译      更新时间:2023-10-16

我有一段代码可以简化为:

template<class T> struct MyStruct;  // No definition by default
template<class T> struct MyStruct<T *> { ... };  // Specialization for pointers

现在某处在我的代码,我得到MyStruct<T>的实例化,碰巧是未定义的(没有c++ 0x/011,没有Boost…没有什么花哨的,只是简单的c++ 03):

error C2027: use of undefined type 'MyStruct<T>'

问题是,我不知道是在哪里引起的,因为正在进行实例化的代码本身就是一个模板,并且从许多地方调用,带有不同的参数。

是否有一种方法以某种方式找出T在编译时,所以我可以更好地理解错误消息?

(对不起,我忘了说:Visual Studio 2008.)

我相信您正在使用msvc++,如果是这样,那么请查看输出窗口,它可能会打印更多信息,特别是行号以及文件名。一旦你知道了文件和行号,你就可以从那里开始了。

输出窗口通常打印所有内容,比如模板如何被实例化以及使用什么模板参数被实例化。一切都要循序渐进。这些消息在调试时非常有用。

正如您发现的那样,启用/WL将在输出窗口中打印更多详细消息。

我知道你说没有c++ 11,但你可能要考虑,因为c++ 03代码在所有c++ 11兼容的编译器中是向后兼容的,使用c++ 11的static_assert功能来调试你的代码…如果您必须使用c++ 03编译器进行最后的编译,那么您可以始终创建#define并使用#ifdef#endif预处理器宏,以确保static_assert特性不会在不支持c++ 11特性的早期编译器中引起问题。

查看MSDN文档获取更多信息