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");有两种可能性:

  • 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 回答