如何将const限定符添加到vector <> :: pointer?

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

我试图将一个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来写它。

c++ c++11 templates pointers const
1个回答
2
投票

对于const ImageConstRefArray::pointerconst在指针本身上有资格,所以它将是std::reference_wrapper<const Image>* constconst指向非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
© www.soinside.com 2019 - 2024. All rights reserved.