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;:参数包需要一个类型模板
答案 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();
}