模板函数参数转换
template function parameters conversion
给定以下简单(和愚蠢的:))类模板:
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) {}
它确实让我这样做。
编译器不应该接受字符串对象的字符串文本吗?我的意思是,他们确实(我想)定义了一个接受常量字符*的ctor。由于像这样的事情:
void foo(const string& s) {}
和
foo("Hey there");
工作,我想这与模板参数有关。
很想得到澄清。
- 编译器不应该接受字符串对象的字符串文本吗?
只有当它是明确的。在您的情况下,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"));
注意:如果您发现自己输入了诸如"它不会让我"之类的短语,则应直接复制/粘贴您收到的实际错误。
uick 的答案是,大多数隐式类型转换没有完成/受到限制 在模板化函数中。
相关文章:
- C++转换参数初始化问题
- C2664 无法从'initializer list'转换参数
- 隐式可转换参数,但属于引用类型
- 传递到函数(C )时转换参数
- 了解错误 C2664:无法转换参数 1
- 错误 C2664:无法从'NvPhysicalGpuHandle'转换参数 1
- Unicode 字符问题/转换参数
- 在运行时根据某些元数据强制转换参数包值
- 错误 C2664:"errno_t wcstombs_s(size_t *,字符 *,size_t,常量 wchar_t *,size_t)":无法转换参数 4
- 错误C2664:无法转换参数错误
- 无法转换参数错误
- Boost.python自动转换参数
- "尝试升级使用已弃用的转换参数指定的输入文件"是什么意思?
- 是否可以在函数模板中转换参数C++?
- 错误C2664:无法转换参数(指纹传感器检测)
- 无法转换参数 - 模板错误
- 编译zxing时,Libconv无法转换参数
- C++ 无法转换参数
- std::p air<_Ty1,_Ty2>::p air<_Ty1,_Ty2>& 无法转换参数
- 无法转换参数-转换丢失限定符