1

これは、行われたインタビューの質問です。

どの行にエラーがありますか?

  #include<iostream>
  template<class T> void foo(T op1, T op2)
  {
      std::cout << "op1=" << op1 << std::endl;
      std::cout << "op2=" << op2 << std::endl;
  }

  template<class T>
  struct sum
  {
      static void foo(T op1, T op2)
      {
              std::cout << "sum=" << op2 << std::endl ;
      }
  };

  int main()
  {
      foo(1,3);  // line1
      foo(1,3.2);  // line2
      foo<int>(1,3);  // line3
      foo<int>(1, '3') ; // line 4
      sum::foo(1,2) ; // line 5  , 

      return 0;
  }

テンプレート パラメータが定義と一致しないため、2 行目にエラーがあります。テンプレート パラメータが欠落しているため、5 行目にエラーがあります。

しかし、1行目はエラーではなく、なぜかわかりませんが、テンプレートパラメータも抜けていませんか?

ありがとう !

4

2 に答える 2

5

型推論といいます。

1 行目では、パラメータとが両方ともであるTため、 の型を推測できます。op1op2intTint

2 行目では、int と double の両方を渡しているのに対し、関数は両方のパラメーターを as として受け入れますがT、コンパイラーは a と のどちらにするべきかわかりませTん。doubleint

特殊化を指定して s もint渡すため、3 行目は問題ありませんint(特殊化は冗長ですが、完全に問題ありません)。

T4 行目は、int であると宣言し、char'3'をその数値にキャストするため、問題ありませんint

5 行目は、テンプレート化された構造体から型を取得する関数にアクセスしており、型推定は関数に対してのみ機能するため、エラーです。

于 2012-06-03T18:21:07.970 に答える
0

関数テンプレートを使用すると、コンパイラは、テンプレート パラメーターにバインドするテンプレート引数を推測します。コンパイラが実際のテンプレート引数を決定すると、関数のインスタンスをインスタンス化します。基本的に、コンパイラは各型パラメーターの代わりにどの型を使用するかを判断します。したがって、op1op2が同じ型の場合、テンプレート パラメーターは省略できます (そのため、2 行目でエラーが発生します)。

C++ 入門から

于 2012-06-04T11:17:46.157 に答える