[英]compilation error C++ templated function with iterators as arugments
我以为我已经开始了解C ++了。
然后我写了我以为我们是非常简单的模板化函数,突然之间似乎没有任何意义。 编译器似乎都不喜欢我定义了模板化函数的事实,这似乎有些疯狂。 它是单个编译单元,因此我不确定它会抱怨什么。
#include <vector>
#include <iostream>
typedef std::vector<int> int_vec_type;
template <typename Type>
bool print_vec(Type::const_iterator itr, const Type::const_iterator end)
{
for (; itr != end; ++itr) {
std::cout << *itr << std::endl;
}
return true;
}
int
main()
{
int_vec_type ivec;
ivec.push_back(0);
ivec.push_back(1);
ivec.push_back(2);
print_vec(ivec.begin(), ivec.end());
return 0;
}
这些是编译错误:
tia.cc:7:22:错误:'bool print_vec'的模板声明
tia.cc:7:37:错误:在'itr'之前预期为')'
tia.cc:7:42:错误:“ const”之前的预期主表达式
tia.cc:在函数'int main()'中:
tia.cc:25:39:错误:未在此范围内声明'print_vec'
提前致谢。
容器的类型不能从迭代器的类型推导出。 您可以将模板简单地转换为:
template <typename Iterator>
bool print_vec(Iterator itr, const Iterator end)
{
for (; itr != end; ++itr) {
std::cout << *itr << std::endl;
}
return true;
}
第一个问题:您尚未使用typename
。 无论类型取决于模板参数,都必须在类型typename
加上typename
。
其次,编译器无法推断type
。 它只能看到ivec.begin()
的类型,并且不知道其他任何可能将其作为typedef的类型。 您只能直接采用const_iterator
您不能采用T::const_iterator
无论如何都必须显式传递T
最好的解决方案是使用迭代器类型作为模板,因为不能从函数参数推导出容器的类型:
template <typename Iterator>
bool print_vec(Iterator itr, Iterator end) { .... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.