模板特化中缺少方法

时间:2012-10-12 08:48:31

标签: c++ templates

  1. 如何确保(类)模板的特化实现所有 功能? (现在只有当我使用mul时才收到错误消息。)
  2. traits1 / traits2的int特化之间有什么区别?我认为它们都是模板特化,但traits2不接受static并且提供链接器错误而不是编译器错误。
  3. #include <iostream>
    
    template<typename T>
    struct traits1{
      static T add(T a, T b) { return a+b; } /* default */
      static T mul(T a, T b);                /* no default */
    };
    
    template<>
    struct traits1<int> {
      static int add(int a, int b) { return a*b; }
      /* static int mul(int a, int b) missing, please warn */
    };
    
    template<typename T>
    struct traits2{
      static T add(T a, T b);
      static T mul(T a, T b);
    };
    
    template<>
    int traits2<int>::add(int a, int b) { return a*b; }
    
    /* traits2<int>::mul(int a, int b) missing, please warn */
    
    int main()
    {
      std::cout << traits1<int>::add(40, 2) << "\n";
      // error: mul is not a member of traits1<int>
      //std::cout << traits1<int>::mul(40, 2) << "\n";
    
      std::cout << traits2<int>::add(40, 2) << "\n";
      // error: undefined reference to traits2<int>::mul(int, int)
      //std::cout << traits2<int>::mul(40, 2) << "\n";
      return 0;
    }
    

1 个答案:

答案 0 :(得分:2)

1)如果您想要的只是一个特定函数的不同行为,请不要专门化整个类。单独专注于这个功能:

template<>
int traits1<int>::add(int a, int b) { return a*b; }

您无法确保专业化实现所有模板方法,因为它们是无关的。

2)你没有提供traits2::mul的定义,所以当然你得到链接器错误 - 声明就在那里。