Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用sfinae进行模板参数推导_C++_Templates_Sfinae_Template Templates - Fatal编程技术网

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) {}