模板作为函数模板的参数 - 演绎失败
Template as a parameter of function template - deduction fail
我想创建这样的模板,它可以推断TT类模板为T类型:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template < template <typename> class TT, typename T>
T f(TT<T*> & A ){
cout << "it worksn";
return *A[0];
};
int main(){
vector<int*> v;
f(v);
return 0;
}
我有一个错误(使用 clang-4.0(:
temded2.cpp: In function ‘int main()’:
temded2.cpp:20:21: error: no matching function for call to ‘f(std::vector<int*>&)’
f<std::vector>(v);
^
temded2.cpp:12:3: note: candidate: template<template<class> class TT, class T> T f(TT<T*>&)
T f(TT<T*> & A ){
^
我认为TT应该等于std::vector,T应该等于int,我做错了什么?
您的模板模板参数不是您认为的那样。std::vector<T>
比您想象的要多,包括您未考虑的默认模板参数。幸运的是,C++11 中的可变参数将帮助您解决这个问题
#include <iostream>
#include <vector>
template < template <typename, typename...> class TT, typename T, typename... Args>
T f(TT<T*, Args...> & A )
{
std::cout << __PRETTY_FUNCTION__ << 'n';
if (A.size() > 0)
return *(A[0]);
return T();
};
int main()
{
std::vector<int*> v;
f(v);
return 0;
}
输出
T f(TT<T *, Args...> &) [TT = vector, T = int, Args = <std::__1::allocator<int *>>]
请注意上面的Args
。由于非常具体的模板模板参数预期参数列表中缺少这些内容,因此不匹配。如您所见,可变参数可以解决这个问题。
std::vector
是一个类模板,它采用两个模板参数:
template<
class T,
class Allocator = std::allocator<T>
> class vector;
您的f
需要一个只有一个模板参数的类模板。所以它根本不匹配。
由于 vector 是一个具有两个模板参数的模板,一个用于元素的类型,一个用于分配器,
template<
class T,
class Allocator = std::allocator<T>
> class vector;
您的 temlate 参数 B 还需要两个模板参数,因此函数如下所示:
template <template <typename, typename> class V, typename T, typename A>
T f(V<T, A>& arg ){
cout << "it worksn";
return arg[0];
};
现在该功能可以工作了。现场演示
相关文章:
- 模板模板参数的演绎指南
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- C++17模板演绎指南不用于空参数集?
- 演绎指南和具有可变参数模板构造函数的可变参数类模板 - 参数包长度不匹配
- 可变参数模板构造函数的演绎指南失败
- 模板作为函数模板的参数 - 演绎失败
- 是否可以保证模板模板参数调用用户提供的演绎指南
- 可变参数模板作为模板参数:演绎适用于 GCC,但不适用于 Clang
- 错误:没有匹配的函数调用[…]注意:模板参数演绎/替换失败
- 演绎模板参数c++
- 模板参数演绎/替换失败
- 如何帮助编译器演绎模板参数
- 从数组维数中演绎模板参数
- 为什么这个模板参数不可演绎?
- c++模板参数演绎失败
- 为什么模板参数演绎/替换在这里失败?
- 带有多个包的c++模板,按参数和返回值进行演绎
- 模板参数演绎失败
- 参数类型自动演绎和匿名lambda函数