2017-06-17 153 views
0
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:Targs':未声明的标识符 main.cpp中(8):错误C3544: 'Targs':参数包预计一个类型模板模板可变参数模板的:参数包期望一个类型模板

+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本身)。
编译器一直很清楚地告诉你:未声明的标识符


话虽这么说,你的问题没有一个实际的问题,所以我不知道你从一个答案,而是告诉你为什么这是一个错误的期望。

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(); 
}