Spaceship (<=>) operator with iterator implementation results in error: '+' cannot add two pointers
Spaceship (<=>) operator with iterator implementation results in error: '+' cannot add two pointers
这就是我所有的,当然还有典型的 class
的其余部分,带有构造函数、析构函数等。但是,Visual Studio 2022 中的 C++ 编译器给我这个错误:
CS2110 '+' cannot add two pointers.
考虑到我在此 class 中的私人声明,这是有道理的。但是,我不确定如何正确解决这个问题?在我的其他实现中,实际大小不是 pointer,而是类型 size_t
的 size,这非常有效很好。
私有变量:
T* m_ptr;
size_t* m_counter;
迭代代码:
// Implemented C++ 11 range-based support.
iterator begin() noexcept { return m_ptr; }
iterator end() noexcept { return (m_ptr + m_counter); }
const_iterator begin() const noexcept { return const_iterator(m_ptr); }
const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); }
宇宙飞船(<=>
)操作员代码:
friend auto operator<=>(const SharedPtr& lhs, const SharedPtr& rhs)
{
auto left = lhs.begin();
auto right = rhs.begin();
for (; left != lhs.end() && right != rhs.end(); ++left, ++right) {
if (*left < *right)
return std::strong_ordering::less;
if (*left > *right)
return std::strong_ordering::greater;
}
if (left == lhs.end())
if (right == rhs.end())
return std::strong_ordering::equivalent;
else
return std::strong_ordering::less;
else
return std::strong_ordering::greater;
}
CS2110 '+' cannot add two pointers.
T* m_ptr;
size_t* m_counter;
iterator end() noexcept { return (m_ptr + m_counter); }
// ^
const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); }
// ^
错误在这里。您正试图添加两个指针。指针不能相加;这是一个无意义的操作,程序是ill-formed.
operator<=>
除了调用损坏的 end
函数外,与此错误在其他方面无关。
However, I am not sure, how this can be resolve properly
这取决于您要做什么。这取决于m_ptr
和m_counter
分别指向什么。
如果 m_ptr
指向一个数组元素,和 m_counter
指向一个整数表示数组中连续元素的数量,和你的目标是得到一个超过元素数量的指针,然后你可以通过m_counter
指针间接获取大小,并将其添加到 m_ptr
:
iterator end() noexcept { return m_ptr + *m_counter; }
但这提出了一个新问题:为什么 m_counter
是一个指针?为什么数组的大小不是按值存储的?
m_counter
it is the reference counter.
如果 m_counter
不是 m_ptr
指向的元素的连续元素数,那么上面的添加没有意义,可能会导致未定义的行为。在这种情况下,请不要这样做。
这就是我所有的,当然还有典型的 class
的其余部分,带有构造函数、析构函数等。但是,Visual Studio 2022 中的 C++ 编译器给我这个错误:
CS2110 '+' cannot add two pointers.
考虑到我在此 class 中的私人声明,这是有道理的。但是,我不确定如何正确解决这个问题?在我的其他实现中,实际大小不是 pointer,而是类型 size_t
的 size,这非常有效很好。
私有变量:
T* m_ptr;
size_t* m_counter;
迭代代码:
// Implemented C++ 11 range-based support.
iterator begin() noexcept { return m_ptr; }
iterator end() noexcept { return (m_ptr + m_counter); }
const_iterator begin() const noexcept { return const_iterator(m_ptr); }
const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); }
宇宙飞船(<=>
)操作员代码:
friend auto operator<=>(const SharedPtr& lhs, const SharedPtr& rhs)
{
auto left = lhs.begin();
auto right = rhs.begin();
for (; left != lhs.end() && right != rhs.end(); ++left, ++right) {
if (*left < *right)
return std::strong_ordering::less;
if (*left > *right)
return std::strong_ordering::greater;
}
if (left == lhs.end())
if (right == rhs.end())
return std::strong_ordering::equivalent;
else
return std::strong_ordering::less;
else
return std::strong_ordering::greater;
}
CS2110 '+' cannot add two pointers.
T* m_ptr; size_t* m_counter;
iterator end() noexcept { return (m_ptr + m_counter); } // ^ const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); } // ^
错误在这里。您正试图添加两个指针。指针不能相加;这是一个无意义的操作,程序是ill-formed.
operator<=>
除了调用损坏的 end
函数外,与此错误在其他方面无关。
However, I am not sure, how this can be resolve properly
这取决于您要做什么。这取决于m_ptr
和m_counter
分别指向什么。
如果 m_ptr
指向一个数组元素,和 m_counter
指向一个整数表示数组中连续元素的数量,和你的目标是得到一个超过元素数量的指针,然后你可以通过m_counter
指针间接获取大小,并将其添加到 m_ptr
:
iterator end() noexcept { return m_ptr + *m_counter; }
但这提出了一个新问题:为什么 m_counter
是一个指针?为什么数组的大小不是按值存储的?
m_counter
it is the reference counter.
如果 m_counter
不是 m_ptr
指向的元素的连续元素数,那么上面的添加没有意义,可能会导致未定义的行为。在这种情况下,请不要这样做。