Let's say we want a new name for a template class ClassOrig.
template <typename T> class ClassOrig {};
- Directly use using alias, this works fine.
template<typename T> using ClassAlias = ClassOrig<T>;
- Use a wrapper and use using alias inside the wrapper.
template <typename T> class ClassWrapper { public: // static_assert(..., ""); using type = ClassOrig<T>; }; template <typename T> using ClassAlias = typename ClassWrapper<T>::type;
The second solution has trouble deducing types implicitly. The code below cannot deduce template argument. We have to explicitly use the template argument list. I'm wondering why the 1st solution works with the code below but the 2nd solution does not?
template <typename T> void bar(ClassAlias<T> const& v); template <> void bar(ClassAlias<int> const& v) {} // cannot deduce template argument, need to use bar<int> template <typename T> void bar(ClassAlias<T> const& v) {} int main() { ClassAlias<double> a; bar(a); // cannot deduce template argument, need to use bar<double> return 0; }