0

現在、特定の関数をオーバーロードする際に問題が発生しています。ここに私のコードがあります:

template<typename Value>
bool process(Value thisValue)
{
  return processAccordingToTheType(thisValue);
}

したがって、processAccordingToTheType のオーバーロードされた関数が 2 つあります。

bool processAccordingToTheType(int thisValue){}
bool processAccordingToTheType(string thisValue){}

コンパイルしようとすると、次のように表示されました。

error C2665: 'processAccordingToTheType' : none of the 2 overloads could convert all the argument types

私は何をする必要がありますか?

アップデート:

int main()
{
  int i = 1;
  process <int> (i);
}
4

3 に答える 3

3

サンプルコードから、次の2つのことを行う必要があることがわかります。

  1. タイプ固有のprocess関数 を呼び出す
  2. stringこれらの呼び出しをおよびintタイプに制限する

processAccordingToType関数を内部にラップすることprocess<T>は完全に冗長です。process<T>実際には、「型に応じた処理」を意味します。ここでのキーワードは「テンプレートの特化」です。intおよびの「タイプに応じたプロセス」メソッドを特殊化する必要がありますstring

これは次のように実行できます。

#include <iostream>

using namespace std;

template<typename T>
bool process(T t)
{
    // call a Compile-Time Assertion 
    cout << "I don't want this to be called." << endl;
}

template <>
bool process<int>(int i)
{
    cout << "process(int) called." << endl;
}


template <>
bool process<string>(string s)
{
    cout << "process(string) called." << endl;
}

int main()
{
    process(1);
    process(string("s"));
    process(1.0d);
}

出力:

process(int) called.
process(string) called.
I don't want this to be called.

理想的には、API のユーザーがprocess他のタイプを呼び出しないようにする必要があります。実行時にこれを呼び出して処理できるようにすること (私の例で行われているように) は受け入れられません。これは、コンパイル時のアサーションで実現します。その方法については、Andrei Alexandrescu による「Modern C++ Designs」をお読みください。

于 2013-03-14T04:03:15.653 に答える
0

テンプレートの専門化を調べてください。タイプに基づいて別の機能を延期することなく、探していることを行います。

http://www.cprogramming.com/tutorial/template_specialization.html

于 2013-03-13T22:19:06.160 に答える
0

関数テンプレートは、非テンプレート関数または別のテンプレート関数でオーバーロードできます。テンプレートのエラーは理解するのが難しいことで知られているため、何をするにしても段階的にテストするようにしてください。

http://www.cplusplus.com/doc/tutorial/templates/

#include <iostream>

using namespace std;


template <typename Value>
bool processAccordingToTheType( Value thisValue ){
    cout << "Generic Type" << endl;
    return false;
}

bool processAccordingToTheType(int thisValue){
    cout << "int type" << endl;
    return true;
}

template <typename Value>
bool process( Value thisValue ){
    return processAccordingToTheType(thisValue);
} 

int main( int argc, char* argv[] ){

    cout << process( 1 ) << endl;
    cout << process( "Hello" ) << endl;

    return 0;
}
于 2013-03-13T22:20:00.737 に答える