到目前为止,我写了这篇文章:
template <typename TType>
void print_vector(const std::vector<TType>& vec)
{
typename std::vector<TType>::const_iterator it;
std::cout << "(";
for(it = vec.begin(); it != vec.end(); it++)
{
if(it!= vec.begin()) std::cout << ",";
std::cout << (*it);
}
std::cout << ")";
}
template<>
template <typename T2>
void print_vector(const std::vector< std::vector<T2> >& vec)
{
for( auto it= vec.begin(); it!= vec.end(); it++)
{
print_vector(*it);
}
}
第一个功能可以很好地处理std::vector< double>
之类的东西。现在,我也希望能够打印std::vector< std::vector< TType>>
东西。第二部分没有编译,但这就是我解决任务的“想法”。关于如何实现这种行为有什么建议吗?
Compilation Error: too many template-parameter-lists
答案 0 :(得分:7)
删除template<>
部分,函数模板重载可以正常工作。
template <typename TType>
void print_vector(const std::vector<TType>& vec)
{
typename std::vector<TType>::const_iterator it;
std::cout << "(";
for(it = vec.begin(); it != vec.end(); it++)
{
if(it!= vec.begin()) std::cout << ",";
std::cout << (*it);
}
std::cout << ")";
}
template <typename T2>
void print_vector(const std::vector< std::vector<T2> >& vec)
{
for( auto it= vec.begin(); it!= vec.end(); it++)
{
print_vector(*it);
}
}
答案 1 :(得分:2)
您实际上可能想寻求一种更通用的解决方案,允许打印几乎所有可迭代的类型:
#include <vector>
#include <iostream>
template <typename Iterable>
std::ostream& operator<<(std::ostream& os, const Iterable& vals)
{
for (const auto& val : vals)
os << val << std::endl;
return os;
}
int main()
{
auto simple_vec = std::vector<int>{3, 5 , 7};
std::cout << simple_vec;
auto nested_vec = std::vector<std::vector<int>>{{1, 2}, {3, 4}};
std::cout << nested_vec;
}
要对该解决方案进行进一步的改进,您可以尝试使用SFINAE,以确保模板化的<<
仅适用于可迭代类型。
答案 2 :(得分:0)
如果您使函数能够打印基类型并递归地使用vector覆盖向量:
template<typename T>
void print( const T &t )
{
std::cout << t;
}
template<typename T>
void print( const std::vector<T> &v )
{
std::cout << '[';
for( auto it = v.begin(); it != v.end(); ++it ) {
if( it != v.begin() ) std::cout << ',';
print( *it );
}
std::cout << ']';
}
那么您不必为vector的向量或vector的向量的向量写特殊的一个。