在调试了一些(更复杂的)模板代码(在其中我使用SFINAE仅在存在特定类构造函数的情况下执行一个函数)并且无法理解该错误之后,我做了一个最小的示例,我可以似乎无法弄清楚这有什么道理。
最小(或我可以想出的最小)示例:
#include <string>
class MyClass {
public:
MyClass(std::string s, int i){}
};
template<typename>
struct int_ {
typedef int type;
};
template<typename U, typename int_<decltype(U("", 0))>::type = 0>
void fun(){}
int main() {
fun<MyClass>();
return 0;
}
^这是功能齐全,并且行为完全符合我的要求 但是如果我将第13行更改为
template<typename U, typename int_<decltype(U("", 0))>::type = 0>
到
template<typename U, typename int_<decltype(U(std::string(), 0))>::type = 0>
我换人失败。 (它也以declval<std::string>()
等失败)
如果它无法在std::
中某个深处隐藏的两种类型之间进行转换,我仍会在整理文档,但我什至不知道从哪里开始,主要是因为错误是意外的(至少我)
no matching function for call to 'MyClass::MyClass(std::basic_string<char>, std::basic_string<char>)'
和
no known conversion for argument 2 from 'std::basic_string<char>' to 'int'
是相关的部分(如果其他部分可能与之相关,here is a link to cpp.sh with the failing code我很困惑)
据我所知,std::string
会覆盖任何后续类型,但是参数的数量保持不变。即使模板参数超过2个,它也会执行此操作(我实际上在其中使用的代码有4个,并且它说我为所有4个参数都传入了std::string
)
我犯了一个愚蠢的错误吗?我只是不知道为什么会这样,为什么使用char *
会解决这个问题。