C++ 基础知识:模板运算符重载失败 - “模板参数推导/替换失败”

问题描述 投票:0回答:1

我一直在尝试编写自己的向量类以更好地理解 C++ 模板和迭代器,但已经被这个错误困扰了一段时间,非常感谢您的帮助。

代码在倒数第二行失败,我称之为重载运算符

-

代码:

#include <memory>

template <typename T>
struct MyVector {
    struct iterator {
        T* ptr;
        iterator(T* p) : ptr(p) {}
    };

    std::unique_ptr<T[]> data;    
    size_t size;

    MyVector() : data(nullptr), size(0) {}
    MyVector(size_t sz) : size(sz) {
        data = std::make_unique<T[]>(size);
    }
    iterator begin() {
        return iterator(data.get());
    }
    iterator end() {
        return iterator(data.get() + size);
    }
};

template <typename T>
int operator-(typename MyVector<T>::iterator a, typename MyVector<T>::iterator b) {
    return a.ptr - b.ptr;
}

int main() {
    MyVector<int> mv(3);
    mv.end() - mv.begin(); // fails
}

错误:

so.cpp: In function ‘int main()’:
so.cpp:32:14: error: no match for ‘operator-’ (operand types are ‘MyVector<int>::iterator’ and ‘MyVector<int>::iterator’)
   32 |     mv.end() - mv.begin();
      |     ~~~~~~~~ ^ ~~~~~~~~~~
      |           |            |
      |           |            iterator<[...]>
      |           iterator<[...]>
so.cpp:26:5: note: candidate: ‘template<class T> int operator-(typename MyVector<T>::iterator, typename MyVector<T>::iterator)’
   26 | int operator-(typename MyVector<T>::iterator a, typename MyVector<T>::iterator b) {
      |     ^~~~~~~~
so.cpp:26:5: note:   template argument deduction/substitution failed:
so.cpp:32:25: note:   couldn’t deduce template parameter ‘T’
   32 |     mv.end() - mv.begin();
      |               
c++ c++14
1个回答
0
投票

您不应该在全局命名空间中重载

operator-

#include <cstdint>
#include <memory>

template <typename T>
struct MyVector {
  struct iterator {
    T* ptr;
    iterator(T* p) : ptr(p) {}
    ssize_t operator-(const iterator& b) { return ptr - b.ptr; }
  };

  std::unique_ptr<T[]> data;
  size_t size;

  MyVector() : data(nullptr), size(0) {}
  MyVector(size_t sz) : size(sz) { data = std::make_unique<T[]>(size); }
  iterator begin() const { return data.get(); }
  iterator end() const { return data.get() + size; }
};

int main() {
  MyVector<int> mv(3);
  mv.end() - mv.begin();  // succeeds
}
© www.soinside.com 2019 - 2024. All rights reserved.