最近在写一个Tiny的STL库。可是出现了一点小问题。
如果一个typedef使用已定义过的typedef,如下列代码的
using value_type = T;
using reference = value_type&;
using const_reference = const reference;
template <typename T>
class allocator
{
public:
using value_type = T;
using pointer = value_type*;
using const_pointer = const pointer;
using reference = value_type&;
using const_reference = const reference;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
...
const_pointer address(const_reference x) { return static_cast<const_pointer>(&x); }
...
};
但是编译时会出现以下问题:
其中61 行就是上面的address函数。
如果我把typedef 改为以下形式,
using value_type = T;
using pointer = T*;
using const_pointer = const T*;
using reference = T&;
using const_reference = const T&;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
编译报以下错误:
请问,
1、这两种定义方式都可以吗?如果可以,上述两种不同的报错方式该如何解释?
2、第二张图里的error该如何解决?
源代码太多,不大方便粘贴上来。
参见:https://github.com/MarinYoung4596/MySTL/tree/master/MySTL/MySTL
google了好久也没找到原因,因此也不知道该如何解答。
烦请大神们答疑解惑。
亦或者,能否告知这些错误可能是由于什么原因造成的?(或者我哪一块的语法理解不透彻),以便我查漏补缺?
非常感谢!
黄舟2017-04-17 13:13:44
先修正兩個錯誤:
using value_type = T;
using pointer = value_type*;
using const_pointer = const pointer;
using reference = value_type&;
using const_reference = const reference;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
const_pointer
== const pointer
== pointer const
== value_type* const
!= value_type const *
// 這是你想要的
const_reference>const_reference同理。
手上沒有2015,我是用2013編譯的。在去掉了2013不存在的noexcept之後,我還發現你的test_vector.cpp裡面的myvector.insert(it, 2, 300)
實際上呼叫的是這個版本:
template<typename InputIterator>
iterator insert(iterator position, InputIterator first, InputIterator second);
然後就出翔了。建構函式和assign函數也有類似的錯誤。
其實這很好理解,2和300型別一樣,為什麼要去匹配那個size_type和const_reference的,C++的重載不是按照宣告順序的。
所有的錯誤都是歸結到這兩個地方。因為我讓十幾行這樣的程式碼強制對應到你想要的那個重載之後,我發現編譯過了。不過我沒有運行,因為這不是題目要求的範圍,哈哈哈哈。