开发者

How to debug template arguments at compile-time?

开发者 https://www.devze.com 2023-04-03 13:27 出处:网络
I have a piece of code that pretty much reduces down to: template<class T> struct MyStruct;// No definition by default

I have a piece of code that pretty much reduces down to:

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

No开发者_运维问答w somewhere in my code, I'm getting an instantiation of MyStruct<T> that happens to be undefined (no C++0x/011, no Boost... nothing fancy, just plain C++03):

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

The trouble is, I have no idea where this is being caused, because the code that's doing the instantiation is itself a template, and called from numerous places, with different arguments.

Is there a way to somehow figure out what T is at compile-time, so I can understand the error messages better?

(Sorry, I forgot to mention: Visual Studio 2008.)


I believe you're using MSVC++, if so, then see the output window, it might have more info printed, especially the line number along with the filename. Once you know the file and line number, you can start from there.

Output window usually prints everything, like how and with what template argument(s), a template is instantiated. Everything step by step. Those messages are very useful when debugging.

As you found yourself, enabling /WL prints more detail messages in the output window.


I know you said no C++11, but you may want to consider, since C++03 code is backwards compatible in all C++11 compliant compilers, to use the static_assert feature of C++11 to debug your code ... if you must do the final compile with a C++03 compiler, then you can always create a #define and use the #ifdef and #endif pre-processor macros to make sure that the static_assert feature does not cause problems in earlier compilers that do not support C++11 features.

See the MSDN docs here for more info.

0

精彩评论

暂无评论...
验证码 换一张
取 消