C++ 扣除其他类型所依赖的类型
我有这样的情况:C++ 扣除其他类型所依赖的类型,c++,templates,C++,Templates,我有这样的情况: #include <vector> template<typename T, typename U = T> U f(T data) { return U(); } int main() { std::vector<int> vec = {1,2,3}; return f<std::vector<int>, int>(vec); } 这里的问题是std::vector没有一个模板参数。它还
#include <vector>
template<typename T, typename U = T>
U f(T data) {
return U();
}
int main() {
std::vector<int> vec = {1,2,3};
return f<std::vector<int>, int>(vec);
}
这里的问题是
std::vector
没有一个模板参数。它还有一个用于分配器类型的参数。要解决这个问题,您可以添加另一个模板参数,或者只使用可变模板参数,如
template<template<class...> class T, class U>
U f(T<U> data) {
return U();
}
请注意,此行为在C++17中已更改。随着时间的推移,他们放松了规章制度
template<template<class> class T, class U>
U f(T<U> data) {
return U();
}
模板
U f(T数据){
返回U();
}
将在C++17模式下使用gcc,在C++17模式下使用clang,并启用
-frelaxed template template args
。这里的问题是std::vector
没有一个模板参数。它还有一个用于分配器类型的参数。要解决这个问题,您可以添加另一个模板参数,或者只使用可变模板参数,如
template<template<class...> class T, class U>
U f(T<U> data) {
return U();
}
请注意,此行为在C++17中已更改。随着时间的推移,他们放松了规章制度
template<template<class> class T, class U>
U f(T<U> data) {
return U();
}
模板
U f(T数据){
返回U();
}
将在C++17模式下使用gcc,在C++17模式下使用clang,并启用
-frelaxed template template args
。最后一个代码段出现了什么错误?您可以使用typename T::value\u type
而不是UWhat编译器(包括版本和标志)您使用了吗?最后一个代码段出现了什么错误?您可以使用typename T::value\u type
来代替您使用的编译器(包括版本和标志)吗?OP的代码对我来说没有任何更改(在GCC上使用-std=c++17
和使用-std=c++17-frelaxed-template-args
)。从C++17开始,它的格式似乎很好。@HolyBlackCat我确实记得一些关于允许在模板参数中不指定默认参数的内容。我会在有空的时候试着看看是否能找到这篇论文。@HolyBlackCat我找到了论文并将其添加到了答案中。OP的代码对我来说没有任何变化(在GCC上使用-std=c++17
和Clang使用-std=c++17-frelaxed模板args
)。从C++17开始,它的格式似乎很好。@HolyBlackCat我确实记得一些关于允许在模板参数中不指定默认参数的内容。等我有空的时候,我会试试看能不能找到那张纸。@HolyBlackCat我找到了那张纸,并把它加到了答案里。
template<template<class> class T, class U>
U f(T<U> data) {
return U();
}