我最近试图自己写一个小小的STL。但是,在完成矢量容器的实现后似乎失败了。我在“xutility'中发生了一些错误。类。我担心它可能来自模板代码,但我不知道如何处理它。有什么建议吗?
类定义和成员函数声明在vector.h
中定义// vector.h
#ifndef _VECTOR_H_
#define _VECTOR_H_
#include <initializer_list>
#include <cstddef>
#include <memory>
#include "../Declaration/iterator.h"
#include "../Declaration/type_traits.h"
namespace MySTL{
template<typename T>
class vector{
public:
typedef std::size_t size_type;
typedef T value_type;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef std::reverse_iterator<T*> reverse_iterator;
typedef std::reverse_iterator<const T*> const_reverse_iterator;
typedef std::ptrdiff_t difference_type;
public:
vector() : elements(nullptr), first_free(nullptr), cap(nullptr) {}
vector(const vector &);
vector(vector &&); //noexcept;
// explicit
vector(const size_type n);
vector(const size_type n, const value_type &val);
vector(std::initializer_list<value_type> il);
template<typename InputIterator>
vector(InputIterator first, InputIterator second);
vector& operator=(const vector &rhs);
vector& operator=(std::initializer_list<value_type> il);
vector& operator=(vector &&rhs); //noexcept;
~vector();
// TOO MANY CODES TO DISPLAY
// SO I HAVE TO OMIT SOME OF THEM
// I'M SURE THEY ARE INNOCENT
// :-)
private:
// ...
std::allocator<T> alloc;
T* elements; // head pointer
T* first_free; // the pointer that point to the first free element in the array
T* cap; // end of storage
};
}
#include "../Implementation/vector_impl.h" // inclusion compilation model
#endif // _VECTOR_H_
成员函数的实现在vector_impl.h
中定义// vector_impl.h
#ifndef _VECTOR_IMPL_H_
#define _VECTOR_IMPL_H_
#include <utility>
#include <memory>
#include <algorithm>
#include <stdexcept>
#include "../Declaration/vector.h"
using std::uninitialized_fill_n;
using std::uninitialized_copy;
namespace MySTL
{
template <typename T>
vector<T>::vector(const vector &s)
{
auto newdata = alloc_n_copy(s.begin(), s.end());
elements = newdata.first;
first_free = cap = newdata.second;
}
template <typename T>
vector<T>::vector(vector &&s) //noexcept
: elements(s.elements), first_free(s.first_free), cap(s.cap)
{
s.elements = s.first_free = s.cap = nullptr;
}
// I'VE TO OMIT MAJORITY OF FUNCTION IMPLEMENTATIONS BECAUSE THEY ARE PROLIXITY
// YOU CAN FIND IT THROUGH THE QUICK LINKS MENTIONED BEFORE. :-)
}
#endif
然后我写了一个测试用例并使用main函数来调用它,我得到了以下错误:
error 13 error C2868: 'std::iterator_traits<_InIt>::value_type': illegal syntax for using-declaration; expected qualified-name d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 MySTL
error 28 error C2868: 'std::iterator_traits<_InIt>::reference': illegal syntax for using-declaration; expected qualified-name d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 MySTL
error 23 error C2868: 'std::iterator_traits<_InIt>::pointer': illegal syntax for using-declaration; expected qualified-name d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 MySTL
error 8 error C2868: 'std::iterator_traits<_InIt>::iterator_category': illegal syntax for using-declaration; expected qualified-name d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 MySTL
error 18 error C2868: 'std::iterator_traits<_InIt>::difference_type': illegal syntax for using-declaration; expected qualified-name d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 MySTL
error 4 error C2825: '_Iter': must be a class or namespace when followed by '::' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 MySTL
error 9 error C2825: '_Iter': must be a class or namespace when followed by '::' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 MySTL
error 14 error C2825: '_Iter': must be a class or namespace when followed by '::' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 MySTL
error 19 error C2825: '_Iter': must be a class or namespace when followed by '::' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 MySTL
error 24 error C2825: '_Iter': must be a class or namespace when followed by '::' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 MySTL
error 30 error C2665: 'std::_Uninitialized_copy0': none of the 2 overloads could convert all the argument types d:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory 337 1 MySTL
error 29 error C2665: 'std::_Debug_range2': none of the 2 overloads could convert all the argument types d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 584 1 MySTL
error 12 error C2602: 'std::iterator_traits<_InIt>::value_type' is not a member of a base class of 'std::iterator_traits<_InIt>' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 MySTL
error 27 error C2602: 'std::iterator_traits<_InIt>::reference' is not a member of a base class of 'std::iterator_traits<_InIt>' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 MySTL
error 22 error C2602: 'std::iterator_traits<_InIt>::pointer' is not a member of a base class of 'std::iterator_traits<_InIt>' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 MySTL
error 7 error C2602: 'std::iterator_traits<_InIt>::iterator_category' is not a member of a base class of 'std::iterator_traits<_InIt>' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 MySTL
error 17 error C2602: 'std::iterator_traits<_InIt>::difference_type' is not a member of a base class of 'std::iterator_traits<_InIt>' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 MySTL
error 11 error C2146: syntax error : missing ';' before identifier 'value_type' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 MySTL
error 26 error C2146: syntax error : missing ';' before identifier 'reference' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 MySTL
error 21 error C2146: syntax error : missing ';' before identifier 'pointer' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 MySTL
error 6 error C2146: syntax error : missing ';' before identifier 'iterator_category' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 MySTL
error 16 error C2146: syntax error : missing ';' before identifier 'difference_type' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 MySTL
error 10 error C2039: 'value_type': is not a member of '`global namespace'' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 MySTL
error 25 error C2039: 'reference': is not a member of '`global namespace'' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 MySTL
error 20 error C2039: 'pointer': is not a member of '`global namespace'' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 MySTL
error 5 error C2039: 'iterator_category': is not a member of '`global namespace'' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 MySTL
error 15 error C2039: 'difference_type': is not a member of `global namespace'' d:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 MySTL
有没有人可以帮助我?
答案 0 :(得分:0)
我相信你在这里遇到了麻烦:
using std::uninitialized_fill_n;
using std::uninitialized_copy;
因为这些算法(在错误消息中的xmemory 337
周围)包含用于验证调用中使用的迭代器的代码(&#34;检查迭代器&#34;)。您的iterator
作为指针并不适合原始库的代码。
您可能希望自己实现这些函数作为一种解决方法(但也要注意真正的向量实现必须使用分配器在未初始化的内存中构建)。