gpt4 book ai didi

c++ - 为什么这个构造函数重载解析不正确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:50 25 4
gpt4 key购买 nike

这是我的(剥离的)类和一个对象的实例化:

template <typename T, typename Allocator = std::allocator<T> >
class Carray {
typedef typename Allocator::size_type size_type;

// ...

explicit Carray(size_type n, const T& value, const Allocator& alloc = Allocator()) {
// ...
}

template<typename InputIterator>
Carray(InputIterator first, InputIterator last, const Allocator& alloc = Allocator()) {
// ...
}

// ...
}

Carray<int> array(5, 10);

我希望这会调用 Carray(size_type, const T&, const Allocator&)构造函数,但它没有。显然这决定了 template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&) .

我应该更改什么才能使它按预期工作?我也觉得很奇怪,因为调用 std::vector<int> v(5, 10)工作得很好。如果我查看 GCC 实现中构造函数的定义,我会发现这一点(我重命名了一些编译器实现名称,例如 __n ):

template<typename T, typename A = std::allocator<T> >
class vector {
typedef size_t size_type;
typedef T value_type;
typedef A allocator_type;

// ...

explicit vector(size_type n, const value_type& value = value_type(), const allocator_type& a = allocator_type());

template<typename InputIterator>
vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type());

// ...
};

这似乎是一样的。

最佳答案

显式构造函数需要一个 size_t 和一个 int。您提供了两个整数。

int 代替 InputIterator 使模板更匹配。

如果您仔细观察标准容器,您会发现它们使用一些模板元编程来确定 InputIterator 是真正的迭代器还是整数类型。然后重定向到不同的结构。

编辑
这是一种方法:

  template<class _InputIterator>
vector(_InputIterator _First, _InputIterator _Last,
const allocator_type& _Allocator = allocator_type() )
: _MyAllocator(_Allocator), _MyBuffer(nullptr), _MySize(0), _MyCapacity(0)
{ _Construct(_First, _Last, typename std::is_integral<_InputIterator>::type()); }

private:
template<class _IntegralT>
void _Construct(_IntegralT _Count, _IntegralT _Value, std::true_type /* is_integral */)
{ _ConstructByCount(static_cast<size_type>(_Count), _Value); }

template<class _IteratorT>
void _Construct(_IteratorT _First, _IteratorT _Last, std::false_type /* !is_integral */)
{ _Construct(_First, _Last, typename std::iterator_traits<_IteratorT>::iterator_category()); }

如果编译器没有 std::type_traits,您也可以使用 boost::type_traits。

关于c++ - 为什么这个构造函数重载解析不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050441/

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