4

次のように定義された関数があります。

template < class T> T doSomething(const T value, const T value2, const T value3)
{
   T temp = value;
       //Do stuff
   return temp ;
}

私のメインでは、次のように呼び出します。

doSomething(12.0, 23.0f, 2.0f);

call に一致する関数がないというエラーが表示されますdoSomething(double, float, float)

const_cast を使用しようとしましたが、問題は解決していないようです。どんな助けでも大歓迎です。

4

4 に答える 4

8

それはについてではありませんconstが、それについては両方同時にTすることはできません。doublefloat

非テンプレート関数がある場合、1 つ以上のパラメーターをパラメーター型に昇格 (または変換) できます。テンプレート関数を使用すると、コンパイラは、テンプレートの型が何であるかを決定することから開始する必要があります。ここでは判断できません。

于 2012-08-08T16:50:29.110 に答える
6

関数定義は、3 つの引数のすべてに同じ型「T」を使用します。このような場合、C++ は型を差し引くことができません。

修正方法を選択してください:

  • 引数ごとに異なる型
    template<型名A、型名B、型名C>
    A doSomething(const A& value, const B& value2, const C& value3)
    {
        temp = 値;
        //何かをする
        戻り温度;
    }
  • 呼び出し時の明示的なテンプレート引数:
    doSomething<int>(12.0, 23.0f, 2.0f);
  • 呼び出し時の引数の明示的な型キャスト:
    doSomething(12.0, static_cast<double>(23.0f), static_cast<double>(2.0f));
于 2012-08-08T17:01:50.643 に答える
0

このように呼び出すと:

doSomething(12.0, 23.0f, 2.0f);

次に、基本的にコンパイラーにT関数の引数からテンプレート引数を推測させます。しかし、上記の呼び出しでは、すべての引数の型は同じではありません: 最初の引数12.0doubleであり、残りの 2 つの引数はfloat( in は aになり、 while.であることに注意してくださいf2.0ffloat2.0double)。したがって、コンパイラが引数として受け入れる関数を見つけようとしているため、問題が発生double, float, floatします。しかし、そのような機能はありません。また、すべての引数で同じTでなければならないため、引数から関数テンプレートを推測することはできません。

したがって、解決策は、または次Tのいずれかとして推測できます。doublefloat

doSomething(12.0f, 23.0f, 2.0f);  //all are float now

またはこれ:

doSomething(12.0, 23.0, 2.0);    //all are double now

最初のケースでTは、 と推定されfloat、2 番目のケースでTは、 と推定されdoubleます。

または、テンプレート引数を次のように指定することで、テンプレート引数の推論に依存しないことを選択できます。

doSomething<float>(12.0, 23.0f, 2.0f); 

またはこれ:

doSomething<double>(12.0, 23.0f, 2.0f); 

ここで、最初のケースでは第 1 引数が に変換されfloat、第 2 のケースでは第 2 および第 3 引数が に変換されdoubleます。

于 2012-08-08T17:00:15.730 に答える
0

テンプレート化された関数を使用する場合、山かっこ内にテンプレート パラメーターを指定する必要があります。

つまり、使用する必要がありますdoSomething<float>(12.0, 23.0f, 2.0f);

または、少なくとも、そうでない場合、コンパイラは何が何でTあるかを推測doubleする必要があります。doSomething<double>()

于 2012-08-08T16:50:39.003 に答える