1

次の単純な(そしてばかげた:))クラステンプレートが与えられます:

template<typename T>
class Temp {

int _a;
int _b;
int _c;

public:
template<typename F>
Temp(F a, F b, F c) : _a(a), _b(b), _c(c) {}

template<>
Temp(const string& a, const string& b, const string& c) : _a(1), _b(2), _c(3) {}
};

メインの ctor と文字列用の ctor の専門化があります。クラスが意味をなさないことは知っていますが、それは重要ではありません。

私がやろうとすると:

Temp<int> t1("a", "b", "c");

それは私をさせません。

しかし、私が変更した場合:

Temp(const string& a, const string& b, const string& c) : _a(1), _b(2), _c(3) {}

に:

Temp(const char* a, const char* b, const char* c) : _a1(),_b(2),_c(3) {}

それは私にやらせてくれます。

コンパイラは文字列オブジェクトの文字列リテラルを受け入れるべきではありませんか? つまり、彼らは (私が思うに) const char *.. を受け入れる ctor を定義しました。

void foo(const string& s) {}

foo("Hey there");

仕事、それはテンプレートの引数と関係があると思います。

説明をいただければ幸いです。

4

2 に答える 2

1
  • コンパイラは文字列オブジェクトの文字列リテラルを受け入れるべきではありませんか?

明確な場合のみ。あなたの場合、Temp<int> t1("a", "b", "c");2つの可能性があります:

  • template<typename F> Temp(F a, F b, F c)F=const char[2]
  • template<> Temp(const string& a, const string& b, const string& c)

コンパイラに関する限り、両方とも有効ですが、最初のものが正確に一致するため、選択されます。

自分で変換を行う場合は、その選択を明確にします。

Temp<int> t1(string("a"), string("b"), string("c"));

注: "It won't let me" のようなフレーズを入力している場合は、その直後に実際に発生しているエラーをコピー/貼り付けする必要があります。

于 2013-10-27T05:10:11.187 に答える
0

簡単な答えは、ほとんどの暗黙的な型変換が行われていないか、テンプレート化された関数で制限されているということです。

于 2013-10-27T05:12:34.130 に答える