简体   繁体   中英

How to debug template arguments at compile-time?

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

Now 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM