'auto *const' 具有 std::_Array_iterator<char, 48> 类型的不兼容初始值设定项
'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
我正在尝试使用 clang 11.0.1、c++14 为 PS4 平台编译此代码。 some_array
是 std::array
初始化为 std::array<char, 48> some_array{{}};
auto* const characters = std::remove(some_array.begin(),
some_array.begin() + length, filtered_character);
我收到以下错误
'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
我不确定我是否需要使用 cmake 或与逻辑有关的东西来抑制警告。
不必将迭代器定义为 class 模板 std::array
的指针。 它是实现定义的(尽管某些 C++ 库确实可以将迭代器实现为指针)。
还有这个错误信息
'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
意味着实际上在使用的编译器及其库中迭代器不是指针。
所以使用
auto characters = std::remove(some_array.begin(),
some_array.begin() + length, filtered_character);
std::remove
returns the forward iterator,不是指针。
template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );
^^^^^^^^^^
在你的情况下,它的类型是
std::array<char, 48>::iterator
因此,您不需要添加auto*
,而是让编译器为您推断类型。所以你只需要 auto
:
auto characters = std::remove(some_array.begin()
, some_array.begin() + length
, filtered_character);
为了验证类型。 see here
#include <type_traits> // std::is_same_v
auto characters = std::remove(some_array.begin()
, some_array.begin() + length
, filtered_character);
static_assert(std::is_same_v<decltype(characters), std::array<char, 48>::iterator>
, "Are not same!");
作为旁注,算法 std::remove
实际上不会删除任何元素,而只是将它们移动到序列的末尾,这样一来,所有“删除”的元素都落后于您范围内的某个边界。
如果您的目的是擦除元素,您应该想到诸如 std::vector
, std::list
, etc with erase–remove idiom or simply std::erase
(Since C++20).
之类的容器
我正在尝试使用 clang 11.0.1、c++14 为 PS4 平台编译此代码。 some_array
是 std::array
初始化为 std::array<char, 48> some_array{{}};
auto* const characters = std::remove(some_array.begin(),
some_array.begin() + length, filtered_character);
我收到以下错误
'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
我不确定我是否需要使用 cmake 或与逻辑有关的东西来抑制警告。
不必将迭代器定义为 class 模板 std::array
的指针。 它是实现定义的(尽管某些 C++ 库确实可以将迭代器实现为指针)。
还有这个错误信息
'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
意味着实际上在使用的编译器及其库中迭代器不是指针。
所以使用
auto characters = std::remove(some_array.begin(),
some_array.begin() + length, filtered_character);
std::remove
returns the forward iterator,不是指针。
template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );
^^^^^^^^^^
在你的情况下,它的类型是
std::array<char, 48>::iterator
因此,您不需要添加auto*
,而是让编译器为您推断类型。所以你只需要 auto
:
auto characters = std::remove(some_array.begin()
, some_array.begin() + length
, filtered_character);
为了验证类型。 see here
#include <type_traits> // std::is_same_v
auto characters = std::remove(some_array.begin()
, some_array.begin() + length
, filtered_character);
static_assert(std::is_same_v<decltype(characters), std::array<char, 48>::iterator>
, "Are not same!");
作为旁注,算法 std::remove
实际上不会删除任何元素,而只是将它们移动到序列的末尾,这样一来,所有“删除”的元素都落后于您范围内的某个边界。
如果您的目的是擦除元素,您应该想到诸如 std::vector
, std::list
, etc with erase–remove idiom or simply std::erase
(Since C++20).