假设我们想要一个模板类ClassOrig的新名称。
template <typename T> class ClassOrig {};
template<typename T> using ClassAlias = ClassOrig<T>;
template <typename T> class ClassWrapper { public: // static_assert(..., ""); using type = ClassOrig<T>; }; template <typename T> using ClassAlias = typename ClassWrapper<T>::type;
第二种解决方案无法隐式推断类型。下面的代码不能推断出模板参数。我们必须明确使用模板参数列表。我想知道为什么第一个解决方案适用于下面的代码但第二个解决方案没有?
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; }