C++ 使用sfinae进行模板参数推导
无法为C++ 使用sfinae进行模板参数推导,c++,templates,sfinae,template-templates,C++,Templates,Sfinae,Template Templates,无法为foo和foo2推导模板模板参数 如果删除sfinae部分,则成功推导出foo和foo2的模板参数 如何修复span类或foo和foo2 谢谢 测试(也在at) #包括 模板 使用enable_if_t_const=typename std::enable_if< std::is_const::value >::类型; 模板类跨度; 模板 班距{ 公众: 显式跨度(常数T*常数数据){} }; 模板 void foo(){} 模板 void foo2(S&S){} int main(){
foo
和foo2
推导模板模板参数
如果删除sfinae部分,则成功推导出foo
和foo2
的模板参数
如何修复span
类或foo
和foo2
谢谢
测试(也在at)
#包括
模板
使用enable_if_t_const=typename std::enable_if<
std::is_const::value
>::类型;
模板类跨度;
模板
班距{
公众:
显式跨度(常数T*常数数据){}
};
模板
void foo(){}
模板
void foo2(S&S){}
int main(){
int arr[]={1};
跨度s(arr);
foo();
二(s);
返回0;
}
这是因为,尽管您有一个默认的模板参数,span
不是模板类S
。这是一个模板类s
最简单的修复方法是将其更改为
template <typename T, template<typename...> class S>
void foo2(S<T>& s) {}
模板
void foo2(S&S){}
这样您就可以接受任何类型的S
(尽管我们只使用一种类型)
@Justin如果你添加
-std=c++17
@HolyBlackCat显然是c++17添加了我不知道的东西,它就会编译。我需要调查一下that@HolyBlackCat我想你的意思是它在c++17中工作。请你解释一下,我很好奇。@Giraffe船长我不知道确切的细节,所以我会等其他人来写。贾斯汀当然很感激他有用的答案的复选标记,但是请再等一会儿,看看c++17解析是否可以作为一个答案。将
更改为
将使foo
工作,但foo2
不工作。不知道为什么。@Rzu如果您将foo2
更改为
,您还必须将其设置为foo2(S&S){}
,所以我使用常规类而不是该类的任何专门化?谢谢。为什么参数包(typename…
)在这种情况下有效?嗯。@Rzu当编译器单独查看模板函数时,它是有意义的。有一个模板类s
,我们用一种类型s
来“调用”它。当您传入span
类型时,模板将被实例化,这大致类似于将S
替换为span
,因此S
是span
,因为默认参数是span
template <typename T, template<typename...> class S>
void foo2(S<T>& s) {}