【发布时间】:2020-09-17 03:35:48
【问题描述】:
我一直在想应该给我的问题加上什么标题,但还是失败了,所以如果你找到了一个好的标题,请编辑它。
我正在尝试为vector 或其他container<T> 编写一个打印函数,并为container<container<T>> 编写另一个打印函数,所以我想出了:
template<typename T>
void print(T const& cont){
for (const auto& i : cont) {
cout << i << " ";
}
cout << endl;
}
template<typename T, template<typename> typename Cont>
void print(Cont<T> const& cont) {
for (const auto& i : cont) {
print(i);
}
}
我在这里有 2 个目标容器:
vector<vector<int>> subsets;
vector<int> subset;
当我调用print(subset); 时,程序按预期工作,但是当我调用print(subsets) 时,编译器开始抱怨:
error C2679: binary '<<': no operator found which takes a right-hand operand of type 'const std::vector<int,std::allocator<int>>' (or there is no acceptable conversion)
我的结论是它仍在尝试调用非嵌套模板打印函数,并且在我尝试计算向量时在 cout 上失败。
谁能解释为什么重载解决方案没有按我的预期工作以及我在这里做错了什么?即使我将嵌套模板函数重命名为 printn,它也开始抱怨不同的原因:
error C2784: 'void prints(const Cont<T> &)': could not deduce template argument for 'const Cont<T> &' from 'std::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>'
【问题讨论】:
-
哦,抱歉,还以为少了点什么;),不过 mcve 会很好
标签: c++ c++11 templates overloading language-lawyer