可变参数模板的模板:参数包需要一个类型模板

时间:2017-06-17 05:10:39

标签: variadic-templates

template <typename T, template <typename T, typename... Targs> class C>
void print_(const C<T,Targs>& arg, std::stringstream& ss)
{
    std::for_each(arg.begin(), arg.end(), [&ss](const T& var) { ss << var; });
}

int main()
{
   vector<int> vec{1,2,3};
   std::stringstream ss;
   print_(vec,ss);
}

main.cpp(8):错误C2065:&#39; Targs&#39;:未声明的标识符 main.cpp(8):错误C3544:&#39; Targs&#39;:参数包需要一个类型模板

2 个答案:

答案 0 :(得分:1)

属于模板模板参数引入的模板参数列表的名称仅在该列表中有效 换句话说,这样的事情是合法的:

template<template<typename T, T> class U>
struct S {};

您可以按照以下方式使用它:

template<typename T, T>
struct A {};

template<template<typename T, T> class U>
struct B {};

int main() {
    B<A> b;
}

这不是有效的代码:

template <typename T, template <typename T, typename... Targs> class C>
void print_(const C<T,Targs> &, std::stringstream &);

Targs不再是第一个>符号后面的有效名称(紧随其后的Targs符号)。
编译器一直非常清楚地告诉你:未声明的标识符

话虽如此,在你的问题中并没有实际的问题,所以我不知道你对答案的期望,但告诉你为什么这是一个错误。

答案 1 :(得分:0)

这工作得很好!

#include <iostream>
#include <sstream>
#include <vector>

#include <algorithm>
using namespace std;
template <typename T, template <typename T, typename... > class C, class... Args>
void print_(std::stringstream& ss, const C<T,Args...>& arg)
{
    std::for_each(arg.begin(), arg.end(), [&ss](const T& var) { ss << var << ":"; });
}

int main()
{
   vector<int> vec{1,2,3};
   std::stringstream ss;
   print_(ss, vec);
   cout << ss.str();
}