我有一个类,Jav::String,我使用模板。
class String
{
String();
String(std::size_t);
template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);
}
我希望当我调用带有有符号整数的字符串时,就像MAX_PATH一样,它会调用 std::size_t 又名无符号 int 重载; 因为我希望替换不是失败!基本上,int 没有开始、结束元素,因此替换应该失败,并且该函数不应该是候选函数的一部分。
但是,令我恐惧的是,我得到了一个编译错误,const int 没有开始或结束成员。
什么时候替换是失败的,什么时候不是。它仅适用于类型吗?
替换失败不是错误 (SFINAE) 只涉及重载解析期间模板参数的替换。它的基本含义是,如果在确定要调用哪个函数的过程中替换推导的模板参数导致在某处生成无效的类型或表达式,那么这不会导致编译失败,而只是导致相应的函数不再被视为函数调用的潜在候选者。只有出现在函数模板(或部分类或变量模板专用化)声明中的内容才能受 SFINAE 的约束。函数模板定义的潜在实例化发生在确定要准确调用的函数之后。如果在函数模板定义的实例化过程中,模板参数的替换导致无效的构造,则这种替换失败将是一个错误。
在您的特定情况下,给定两个选项
String(std::size_t);
template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);
调用具有int
类型参数的String
构造函数将选择模板专用化String<int>
因为调用String(std::size_t)
需要一个整体提升,其转换排名比String<int>
给你的完全匹配更差......