3

単純なc++ファイルとクラスTTには2つのメソッドがあります。

#include <map>
#include <string>
#include <iostream>

using namespace std;

class TT{ 
    public:
        TT(const string& str);
        template<class T>T Read(const string& key)const;
        template<class T>T Read(const string& key, const T& value)const;
};

TT::TT(const string& str){
    cout<<str<<endl;
}

template<class T>T TT::Read(const string& key)const{
    std::cout<<key<<std::endl;
    return 1;
}

template<class T>T TT::Read(const string& key, const T& value)const{
    std::cout<<key<<'\t'<<value<<std::endl;
    return value;
}

int main(void){
    TT tt("First");

    tt.Read("Hello", 12);
    return 1;
}

交換する場合

tt.Read("Hello world!", 12);

tt.Read("Hello world!");

main()

G ++によると:

new.cc:31:エラー:「TT :: Read(constchar [5])」の呼び出しに一致する関数がありません</ p>

G ++がRead(const string&key)constメソッドを見つけられないのはなぜですか?

ありがとう!

4

3 に答える 3

6

T を返す関数を定義しようとしています:

template<class T>
T TT::Read(const string& key) const
{
    std::cout << key << std::endl;
    return 1;
}

intただし、この関数からは常に が返されます。次のように呼び出す必要があります。

tt.Read<int>("Hello");

または、ここでは意味がないため、テンプレート定義を削除します。

于 2012-11-27T03:22:51.173 に答える
1

関数template<class T>T Read(const string& key)const;は型 T でテンプレート化されていますが、T は戻り値の型としてのみ表示されます。

戻り値の型を手動で関数に焼き付ける意図がある場合 (そして の外観からそう思われる場合return 1;)、宣言を次のように変更できます。

int Read(const string& key) const;

それ以外の場合は、呼び出しでテンプレート化された型を次のように手動で指定する必要があります。

tt.Read<int>("Hello");

これは、テンプレート化された型が返されるだけである場合、関数はテンプレート化された型を推定できないという事実に要約されます。

C++ 標準では、次のタイトルのセクションで、目に優しくありません。

Explicit template argument specification [temp.arg.explicit]

すべてのテンプレート引数を推測できる場合は、それらをすべて省略できます。この場合、空のテンプレート引数リスト <> 自体も省略できます。演繹が行われて失敗するコンテキスト、または演繹が行われないコンテキストで、テンプレート引数リストが指定され、デフォルトのテンプレート引数とともに単一の関数テンプレートの特殊化を識別する場合、template-id は左辺値です。関数テンプレートの特殊化。

template<class X, class Y> X f(Y);

int i = f<int>(5.6); // Y is deduced to be double
int j = f(5.6); // ill-formed: X cannot be deduced
于 2012-11-27T03:23:07.493 に答える
1

テンプレートを扱うとき、コンパイラは return 関数が何であるかを知りたがっていて、int である 1 を返してもそれを理解できないためだと思います。技術的return 1には、戻り値がどうあるべきかわからないため、エラーになる可能性があります。

使用するtt.Read<int>("Hello");

于 2012-11-27T03:23:31.980 に答える