如何在编译时调试模板参数
How to debug template arguments at compile-time?
我有一段代码可以简化为:
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文档获取更多信息
相关文章:
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 调试可变参数
- 是否有 g++ 或 clang++ 调试选项来指导可变参数模板化
- 如何从Qt Creator中的调试助手访问模板值参数?
- OpenGL 调试 错误回调函数的 ID 参数是什么?
- 如何定义具有依赖于符号调试的参数的函数
- 按值传递的参数在 Visual Studio 2010, C++ 的调试器中显示为通过引用传递
- 如何调试指针参数是否通过函数修改
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 在Visual Studio调试命令参数中逃脱
- 在调试中,如何知道对函数的重复调用中参数的统计数据(max-min,average,distribution..)
- 值传递的参数在 Visual Studio 2015 x64 调试器中显示不正确
- Visual Studio:管理应用的调试命令行参数
- 调试函数参数的值(以C++为单位)
- C++命令行调试参数
- 如何在 Visual Studio 2015 调试中将'%'符号作为命令行参数 (argv) 传递?
- 调试代码并C++未使用的参数警告
- 在调试模式下运行时,VS2012中的命令参数错误