gpt4 book ai didi

c++ - 未在部分特化中使用的模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:05 24 4
gpt4 key购买 nike

我有以下代码:

template<typename T, typename Allocator = std::allocator<T> >
class Carray {
// ...
typedef T* pointer;
typedef pointer iterator;
// ...
};

现在我正在尝试对 iterator_traits 进行部分特化。对我来说似乎没问题,但 g++ 4.4.5 提示:

#include <iterator>

namespace std {
template<typename T, typename Allocator>
struct iterator_traits<typename Carray<T, Allocator>::iterator> { // line 128
typedef T value_type;
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::reference reference;
typedef typename Allocator::pointer pointer;
typedef typename std::random_access_iterator_tag iterator_category;
};
}

这是完整的错误信息:

carray.h:128: error: template parameters not used in partial specialization:
carray.h:128: error: ‘T’
carray.h:130: error: ‘Allocator’ has not been declared
carray.h:131: error: ‘Allocator’ has not been declared
carray.h:132: error: ‘Allocator’ has not been declared

最佳答案

您在这里根本不需要特化:iterator_traits已经专门用于指针类型,如果你最终得到一个类类型的迭代器,你可以只定义那些需要的 typedef s 在迭代器类中。

问题在于,为了匹配主要特化,编译器需要获取使用模板的参数,将它们插入特化,然后查看它们是否匹配。

考虑以下简化场景中会发生什么:

template <typename T> struct S { typedef int type; };

template <typename T>
struct Traits { };

template <typename T>
struct Traits<typename S<T>::type> { };

编译器应该如何知道什么 T插入 S还是一些S<T>::type是真正的意思,而不仅仅是 int

问题在于嵌套的 typedef (::type) 取决于模板参数 (T)。如果在函数参数列表或偏特化中出现这种情况,类型 T不能推导(这是一个“非推导上下文”)。

关于c++ - 未在部分特化中使用的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6398912/

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