[英]Template resolution with template template parameter
我正在尝试实现一个“解码器”,它可以根据预期的返回类型对输入数据进行不同的处理。
以下代码似乎在https://cppinsights.io/中工作:
#include <cstring>
#include <vector>
template<template <class, class> class V, typename T>
void Bar(V<T, std::allocator<T>> &v, char** c) {
size_t s = *(size_t*)*c;
v.resize(s);
memcpy((char*)&v[0], *c, s * sizeof(T));
}
template<typename T>
inline void Bar(T &t, char** c) {
t = *(T*)*c;
}
template<typename T>
T Foo(char** c) {
T t;
Bar<T>(t, c);
return t;
}
char bob[] = {8,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,9,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0};
char boz[] = {5,0,0,0};
int baz = Foo<int>((char **)&boz);
std::vector<int> bub = Foo<std::vector<int>>((char **)&bob);
所以我认为对Foo
的最终调用将使用Bar
的第一个定义,但这并没有发生,如果我删除Bar
的第二个定义,则以下代码无法编译:
#include <cstring>
#include <vector>
template<template <class, class> class V, typename T>
void Bar(V<T, std::allocator<T>> &v, char** c) {
size_t s = *(size_t*)*c;
v.resize(s);
memcpy((char*)&v[0], *c, s * sizeof(T));
}
template<typename T>
T Foo(char** c) {
T t;
Bar<T>(t, c);
return t;
}
char bob[] = {8,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,9,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0};
std::vector<int> bub = Foo<std::vector<int>>((char **)&bob);
我收到以下错误消息:
error: no matching function for call to 'Bar'
template<typename T> T Foo(char** c) { T t; Bar<T>(t, c); return t; }
^~~~~~
note: in instantiation of function template specialization 'Foo<std::vector<int>>' requested here
std::vector<int> bub = Foo<std::vector<int>>((char **)&bob);
^
note: candidate template ignored: invalid explicitly-specified argument for template parameter 'V'
template<template <class, class> class V, typename T> void Bar(V<T, std::allocator<T>> &v, char** c) {
^
我真的不明白这是什么意思,为什么编译器不使用带有“模板模板”参数的定义? 我有类似的“编码”数据的功能,它可以工作,我做错了什么?
我试图解决错误的问题吗? 如何根据预期的返回类型“拆分”解码 function,同时保持其通用性(或者至少对向量与非向量类型进行不同的处理)? 谢谢。
当您编写Bar<T>(...)
时,您正试图在Foo()
中传递一个具体类型的T
。 相反,您需要一个template<class, class> class V
,即一个具有两种类型 arguments 的 class模板。
我相信问题出在Foo
内部。 您正在调用Bar<T>
,它明确表示使用带有单个模板参数的Bar
。 IE,您确保template template
专业化永远不会被选中。 相反,让它自动推断。
这对我有用:https://godbolt.org/z/14h1fdTMT
template<typename T>
T Foo(char** c) {
T t;
Bar(t, c); // auto-deduce here
return t;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.