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

时间:2011-09-07 17:29:10

标签: c++ templates

我有一段代码,几乎减少到:

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。)

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

我知道你说没有C ++ 11,但你可能要考虑,因为C ++ 03代码在所有符合C ++ 11的编译器中向后兼容,要使用C +的static_assert功能+11来调试你的代码...如果你必须用C ++ 03编译器进行最后的编译,那么你总是可以创建一个#define并使用#ifdef#endif前-processor宏,以确保static_assert功能不会在不支持C ++ 11功能的早期编译器中引起问题。

有关详细信息,请参阅MSDN docs here