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)1つの特定の関数の動作が異なるだけの場合は、クラス全体を特殊化しないでください。その機能だけを専門にします。

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

スペシャライゼーションがすべてのテンプレートメソッドを実装していることを確認することはできません。これらは無関係であるためです。

2)の定義を指定しなかったtraits2::mulため、もちろんリンカーエラーが発生します-宣言はそこにあります。

于 2012-10-12T08:51:57.487 に答える