0
  1. 如何确保(类)模板的特化实现所有功能?(现在只有当我使用时mul才会收到错误消息。)
  2. 对于traits1 / traits2,对int的专业化有什么区别。我认为它们都是模板专业化,但 traits2 不接受static并给出链接器错误而不是编译器错误。

.

#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;
}
4

1 回答 1

2

1)如果你想要的只是一个特定功能的不同行为,不要专门化整个类。单独专门化该功能:

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

您不能确保专门化实现所有模板方法,因为它们是不相关的。

2)您没有为 提供定义traits2::mul,因此您当然会收到链接器错误-声明就在那里。

于 2012-10-12T08:51:57.487 回答