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++ 扣除其他类型所依赖的类型_C++_Templates - Fatal编程技术网

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();
}