1

このコードはコンパイルされませんが、理由はわかりません。また、typeid()関数はint入力パラメーターとして受け取ることができるため、問題はテンプレートメカニズムに関連している必要がありますが、この失敗の背後にある理論的根拠はわかりません。

#include <iostream>
#include <typeinfo>

template<typename T> void func(T)
{
  std::cout << typeid(T).name() << std::endl;
}

int main()
{
  func(int);  
  return(0);
}

このテンプレート/コードの何が問題になっていますか?

4

4 に答える 4

3

inttype 自体ではなく、 typeのインスタンスを渡す必要があります。

func(int());
        ^^ note the parentheses

インスタンスを渡したくない場合は、次のようにコードを変更できます。

#include <iostream>
#include <typeinfo>

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}

int main()
{
  func<int>();
  return(0);
}
于 2012-12-14T18:49:54.087 に答える
2

タイプ自体だけでなく、タイプの「インスタンス」を渡す必要がありますint...

func(int(123));

大丈夫だろう

于 2012-12-14T18:50:07.477 に答える
2

trmplate コードに問題はありませんが、

func(int);

無効です。あなたはおそらく意味した

func(int());
于 2012-12-14T18:51:05.973 に答える
1

関数を明示的にインスタンス化し、Tset toで呼び出す場合は、それをテンプレート引数としてint渡す必要があります: .intfoo<int>

type の「通常の」パラメーターを 1 つ使用して関数を宣言したため、これは「通常の」引数を指定する言い訳にはなりませんT

したがって、foo明示的に指定されたテンプレート引数を使用した有効な呼び出しは、次のようになります。

foo<int>(0);
foo<int>(true);
foo<int>('a');

(テンプレート引数を明示的に指定する目的は、テンプレート引数推定メカニズムをオーバーライドすることです)。

その「通常の」パラメーターを架空のものとして保持することが意図されている場合 (名前を付けることさえしなかったため)、デフォルトの引数を指定できます。

template<typename T> void func(T = T())
{
  std::cout << typeid(T).name() << std::endl;
}

その場合、関数は次のように呼び出し可能になります

foo<int>();

または、通常のパラメーターを完全に取り除くことができます (とにかく関数内で使用していないため)。

template<typename T> void func()
{
  std::cout << typeid(T).name() << std::endl;
}

ただし、これにより、常にテンプレート引数を明示的に指定する必要があります。

他に考えていることがあれば、それが何であるかを説明する必要があります。

于 2012-12-14T18:54:50.583 に答える