是否在类的内外使用别名?

时间:2016-01-22 15:06:31

标签: c++ templates c++11 using

假设我们想要一个模板类ClassOrig的新名称。

template <typename T>
class ClassOrig {};
  1. 直接使用别名,这样可以正常使用。
  2. template<typename T>
    using ClassAlias = ClassOrig<T>;
    
    1. 使用包装器并在包装器内使用别名。
    2. 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;
      }
      

0 个答案:

没有答案