给出以下简单(和愚蠢:))类模板:
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 speciailization字符串。 我知道这个课程没有任何意义,但这不是重点。
当我尝试做的时候:
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");
工作,我想这与模板参数有关。
很想得到澄清。
答案 0 :(得分:1)
只有它是明确的。在您的情况下,Temp<int> t1("a", "b", "c");
有两种可能性:
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"));
注意:如果您发现自己键入了“它不会让我”这样的短语,则应该直接复制/粘贴您所获得的实际错误。
答案 1 :(得分:0)
答案很简单,大多数隐式类型转换都没有在模板化函数中完成/受到限制。