也许我今天不在那里,但我想知道如何让它发挥作用。 我想部分地从boost库中专门定位range_mutable_iterator和range_const_iterator,但仅针对特定类型,我宁愿避免明确提及,而只是在enable_if测试条件通过时才选择部分特化。
我目前正在使用MSVC 2008并收到以下错误:
类型
ArrayType
:template parameter not used or deducible in partial specialization
range_mutable_iterator<
typename enable_if<
mpl::and_<
mpl::has_key<some_type_map, typename remove_const<T>::type>,
mpl::not_<is_const<T> >
>,
ArrayType
>::type
>
使用STLFilt,注意奇怪的引用T而不是ArrayType,我猜STLFilt说它无法弄清楚T == ArrayType ..?这就是我现在所拥有的:
namespace boost {
template<class ArrayType>
struct range_mutable_iterator<
typename enable_if<
mpl::and_<
mpl::has_key<some_type_map, typename remove_const<ArrayType>::type>,
mpl::not_<is_const<ArrayType> >
>,/*and_*/
ArrayType
>::type/*enable_if*/
>
{
typedef MyArrayIterator<
typename mpl::at<some_other_type_map,
typename mpl::at<yet_another_type_map,ArrayType>::type
>::type/*at*/
>/*MyArrayIterator*/ type;
};
}
让range_begin / range_end正常工作目前不是问题,目标是让行工作如下:
ThirdPartyArrayClass blah;
MyArrayAdapter<ThirdPartyArrayClass>::iterator iter = boost::begin(blah);
编辑:在尝试了我从这个答案中编辑出来的不同方法之后,我开始接受在这种情况下部分专业化是不可能的,所以我使用了一种不同的方法,涉及完全专业化和大量使用Boost.Preprocessor。
答案 0 :(得分:0)
为了部分特化模板,编译器必须匹配现有特化的实际模板参数,目的是选择最佳匹配。如果专门化中的模板参数仅用作依赖类型的(模板)参数,则这是不可能的。所以,编译器抱怨,这是正确的。你唯一能做的就是以某种方式专注于具体的ThirdPartyArrayClass
类型。