简单 class 的迭代器的开始、结束规范
begin, end specifications for iterators for simple class
我想在我的 Foo 上使用我的 printContainer() class。
如 main() 所示,我的 printContainer 在基本 stl::vectors 上运行良好。
我的 Foo class 的 begin() end() 成员函数似乎在 main().
的循环范围内工作
但是我不能在我的 Foo class 上调用我的 printContainer()。错误是 error: no matching function for call to ‘begin(
我做错了什么?
#include <vector>
#include <iostream>
template <typename Iter, typename Cont>
bool isLast(Iter iter, const Cont& cont) {
return (iter != cont.end()) && (next(iter) == cont.end());
}
template <typename T>
struct is_cont {
static const bool value = false;
};
template <typename T,typename Alloc>
struct is_cont<std::vector<T,Alloc> > {
static const bool value = true;
};
template <typename T, typename std::enable_if< !is_cont<typename T::value_type>::value>::type* = nullptr >
std::string printContainer(T const& container)
{
std::string str = "{";
for (auto it = std::begin(container); it != std::end(container); ++ it)
str += (isLast(it, container) ? std::to_string(*it) + "}" : str += std::to_string(*it) + ",");
return str;
}
template <typename T, typename std::enable_if< is_cont<typename T::value_type>::value>::type* = nullptr >
std::string printContainer(T const& container)
{
std::string str = "{";
for (auto it = std::begin(container); it != std::end(container); ++ it)
str += (isLast(it, container) ? printContainer(*it) + "}" : str += printContainer(*it) + ",");
return str;
}
template <class T, class cmp=std::greater<T>>
class Foo
{
private:
std::vector<T> data_;
public:
typedef typename std::vector<T>::value_type value_type;
Foo(size_t n, T val) : data_(n, val) {}
typename std::vector<T>::iterator begin(){ return data_.begin(); } // for printContainer
typename std::vector<T>::iterator end() { return data_.end(); } // for printContainer
};
int main()
{
std::vector<std::vector<float>> a(2,std::vector<float>(3,3));
std::cout << printContainer(a) << std::endl; // it works !
Foo<float> b(10,2);
for (auto it = std::begin(b); it != std::end(b); it ++)
std::cout << *it << " "; // it works !
// std::cout << printContainer(b) << std::endl; // but this does not work !
}
你传递了一个const
容器,所以你需要Foo::begin() const
和Foo::end() const
成员函数。
您必须添加 Foo
class 那些 const
成员,然后 returns const 迭代器:
typename std::vector<T>::const_iterator begin() const { return data_.cbegin(); } // for printContainer
typename std::vector<T>::const_iterator end() const { return data_.cend(); } // for printContainer
我想在我的 Foo 上使用我的 printContainer() class。
如 main() 所示,我的 printContainer 在基本 stl::vectors 上运行良好。
我的 Foo class 的 begin() end() 成员函数似乎在 main().
的循环范围内工作
但是我不能在我的 Foo class 上调用我的 printContainer()。错误是 error: no matching function for call to ‘begin(
我做错了什么?
#include <vector>
#include <iostream>
template <typename Iter, typename Cont>
bool isLast(Iter iter, const Cont& cont) {
return (iter != cont.end()) && (next(iter) == cont.end());
}
template <typename T>
struct is_cont {
static const bool value = false;
};
template <typename T,typename Alloc>
struct is_cont<std::vector<T,Alloc> > {
static const bool value = true;
};
template <typename T, typename std::enable_if< !is_cont<typename T::value_type>::value>::type* = nullptr >
std::string printContainer(T const& container)
{
std::string str = "{";
for (auto it = std::begin(container); it != std::end(container); ++ it)
str += (isLast(it, container) ? std::to_string(*it) + "}" : str += std::to_string(*it) + ",");
return str;
}
template <typename T, typename std::enable_if< is_cont<typename T::value_type>::value>::type* = nullptr >
std::string printContainer(T const& container)
{
std::string str = "{";
for (auto it = std::begin(container); it != std::end(container); ++ it)
str += (isLast(it, container) ? printContainer(*it) + "}" : str += printContainer(*it) + ",");
return str;
}
template <class T, class cmp=std::greater<T>>
class Foo
{
private:
std::vector<T> data_;
public:
typedef typename std::vector<T>::value_type value_type;
Foo(size_t n, T val) : data_(n, val) {}
typename std::vector<T>::iterator begin(){ return data_.begin(); } // for printContainer
typename std::vector<T>::iterator end() { return data_.end(); } // for printContainer
};
int main()
{
std::vector<std::vector<float>> a(2,std::vector<float>(3,3));
std::cout << printContainer(a) << std::endl; // it works !
Foo<float> b(10,2);
for (auto it = std::begin(b); it != std::end(b); it ++)
std::cout << *it << " "; // it works !
// std::cout << printContainer(b) << std::endl; // but this does not work !
}
你传递了一个const
容器,所以你需要Foo::begin() const
和Foo::end() const
成员函数。
您必须添加 Foo
class 那些 const
成员,然后 returns const 迭代器:
typename std::vector<T>::const_iterator begin() const { return data_.cbegin(); } // for printContainer
typename std::vector<T>::const_iterator end() const { return data_.cend(); } // for printContainer