0

ジェネリック型とジェネリック型 (実行時に定義される) を受け取るメソッドが必要です。この例では、文字列型を使用している場合、最初のパラメーターの長さ (文字列) を返す必要があります。int 型を使用している場合は、最大 (int 整数) を返す必要があります。

見てください:

#include "stdafx.h"
#include <sstream>
#include <iostream>
#include <conio.h>

#include <sstream>
#include <string>
#include <atldbcli.h>

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
 no_namespace rename("EOF", "EndOfFile")

using namespace std;


class Test
{
public:
    template<class T>
    T returnVal(T valueOne, T valueTwo);
};

template<class T>
T Test::returnVal(T valueOne, T valueTwo)
{
    if(typeid(valueOne) == typeid(string))
    {
        string teste = valueOne;
        int testeInt = teste.size();
        ostringstream testeString;
        testeString << testeInt;
        teste = testeString.str();
        return teste;

    }
    else
        return valueOne > valueTwo? valueOne:valueTwo;
}


int main()
{
    string reference = "stringVal";
    Test ref;
    cout << ref.returnVal<string>(reference, "asasas") << endl;
    cout << ref.returnVal<int>(10, 485);
    getch();
    return 0;
}

ただし、main 関数がref.returnVal(10, 485); を呼び出すと、エラーメッセージが表示されます: ' return' : cannot convert from 'std::string' to 'int' ありがとう

4

4 に答える 4

1

以前のすべての回答は、問題を明確に特定しています。それを行うより良い方法については:

class Test
{
public:
    string returnVal(string valueOne, string valueTwo)
    {
        string teste = valueOne;
        int testeInt = teste.size();
        ostringstream testeString;
        testeString << testeInt;
        teste = testeString.str();
        return teste;
    }

    int returnVal(int valueOne, int valueTwo)
    {
        return valueOne > valueTwo? valueOne:valueTwo;
    }
};
于 2013-09-18T17:07:48.290 に答える
0

type のテンプレートをインスタンス化するintと、次のようになります。

int Test::returnVal(int valueOne, int valueTwo)
{
    if(typeid(valueOne) == typeid(string)) // This will be false
    {
        string teste = valueOne;
        int testeInt = teste.size();
        ostringstream testeString;
        testeString << testeInt;
        teste = testeString.str();
        return teste;

    }
    else
        return valueOne > valueTwo? valueOne:valueTwo;
}

問題は、関数の戻り値の型が であっても、 then 節がif文字列を返すことですinttypeif(valueOne)型チェッカーはそれを気にしないので、then-clause が決して実行されないという事実は問題ではありません。彼が見るのは、文字列を返す return ステートメントだけなので、これはエラーです。

必要なことを行うには、文字列の関数をオーバーロードし、テンプレート化された関数から文字列固有のコードをすべて削除するだけです。

于 2013-09-18T16:53:08.600 に答える