次の単純な(そしてばかげた:))クラステンプレートが与えられます:
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");
仕事、それはテンプレートの引数と関係があると思います。
説明をいただければ幸いです。