繁体   English   中英

带有模板模板参数的模板解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM