There are two cases where typedef confuses me when it comes to extern template declaration and explicit template instantiation .
To illustrate these two, see below 2 snippets of code.
Consider the following example (case 1) :
// suppose following code in some cpp file template <typename T> struct example { T value; }; // valid typedefs typedef example<int> int_example; typedef example<std::string> string_example; // explicit instantiation using above typedefs template class int_example; // -> compile time error template class string_example; // -> compile time error // instead we need to use type names template class example<int>; // -> OK template class example<std::string>; // -> OK // QUESTION 1: Why does this work however? is this valid code? typedef std::string type_string; template class example<type_string>;
Why template class example<type_string> work with typedef? and why is it valid while template class string_example not?
Consider the following example (case 2) :
// suppose following code is in some header file template <typename T> struct example { T value; }; // valid typedefs typedef std::string type_string; typedef example<type_string> string_example; // Explicit instantiation declaration // QUESTION 2: Is this valid code? if not why not? extern template string_example; // -> at least this compiles, but is it OK?
As indicated in the above comment, is it correct to use typedef in the extern template declaration , as in the above example, and why this compiler is different from Case1 where it is missing.
I read about similar cases, but none of them gives a detailed answer to the above 2 questions. Detailed development is greatly appreciated!
source share