gpt4 book ai didi

c++ - 如何向 vector<>::pointer 添加 const 限定符?

转载 作者:行者123 更新时间:2023-11-30 03:26:52 25 4
gpt4 key购买 nike

我正在尝试将 const 指针传递给 std::vector 的元素到一个函数,但我似乎无法正确获得函数的签名。我一定在这里遗漏了一些微不足道的东西,但我很困惑。

这是重现问题的最小示例:

#include <vector>
#include <functional>

class Image { void* ptr; };

using ImageConstRefArray = std::vector< std::reference_wrapper< Image const >>;

template< typename T = void, typename... OtherTs >
void TestDataType( const ImageConstRefArray::pointer images ) {
// stuff.
TestDataType< OtherTs... >( images + 1 );
}
template<>
inline void TestDataType<>( const ImageConstRefArray::pointer /*images*/ ) {} // End of iteration

template< typename... Types >
void Function( ImageConstRefArray const& images ) {
TestDataType< Types... >( images.data() );
}

int main() {
Image img1, img2;
ImageConstRefArray array{ img1, img2 };
Function( array );
}

这是 GCC (5.4) 的错误信息:

test.cpp: In instantiation of ‘void Function(const ImageConstRefArray&) [with Types = {}; ImageConstRefArray = std::vector<std::reference_wrapper<const Image> >]’:
test.cpp:24:20: required from here
test.cpp:18:28: error: no matching function for call to ‘TestDataType(const std::reference_wrapper<const Image>*)’
TestDataType< Types... >( images.data() );
^
test.cpp:9:6: note: candidate: template<class T, class ... OtherTs> void TestDataType(std::vector<std::reference_wrapper<const Image> >::pointer)
void TestDataType( const ImageConstRefArray::pointer images ) {
^
test.cpp:9:6: note: template argument deduction/substitution failed:
test.cpp:18:41: note: cannot convert ‘(& images)->std::vector<_Tp, _Alloc>::data<std::reference_wrapper<const Image>, std::allocator<std::reference_wrapper<const Image> > >()’ (type ‘const std::reference_wrapper<const Image>*’) to type ‘std::vector<std::reference_wrapper<const Image> >::pointer {aka std::reference_wrapper<const Image>*}’
TestDataType< Types... >( images.data() );

所以基本上它是在尝试放置一个 const std::reference_wrapper<const Image>*进入 std::reference_wrapper<const Image>* .该函数的签名有 const ImageConstRefArray::pointer作为参数。如果那个const不把指针做成const指针,那么函数签名怎么写呢?唯一的解决方案是写出const std::reference_wrapper<const Image>* ?这解决了问题,但我宁愿用 ImageConstRefArray 来写它.

最佳答案

对于 const ImageConstRefArray::pointer , const在指针本身上是合格的,所以它将是 std::reference_wrapper<const Image>* const (const 指向非常量的指针),但不是 std::reference_wrapper<const Image> const * (指向 const 的非常量指针)。 (注意 const 的不同位置。)

你应该使用 std::vector::const_pointer 相反,它将为您提供指向 const T 的指针类型.例如

template< typename T = void, typename... OtherTs >
void TestDataType( ImageConstRefArray::const_pointer images ) {
// stuff.
TestDataType< OtherTs... >( images + 1 );
}
template<>
inline void TestDataType<>( ImageConstRefArray::const_pointer /*images*/ ) {} // End of iteration

关于c++ - 如何向 vector<>::pointer 添加 const 限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47936824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com