gpt4 book ai didi

c++ - 编译器错误 C2766: "explicit specialization; ' specialization' has already been defined"when using boost::disable_if

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

我正在尝试构建模板类 Fod

template<typename S0 = aux::EmptyType, typename S1 = aux::EmptyType, typename S2 = aux::EmptyType, typename S3 = aux::EmptyType, typename S4 = aux::EmptyType, typename S5 = aux::EmptyType, typename S6 = aux::EmptyType, typename S7 = aux::EmptyType, typename S8 = aux::EmptyType, typename S9 = aux::EmptyType>
class Fod { ... };

它将包含一个带有 static const int value 的内部类 At指示模板参数的索引(S0 为 0,S1 为 1,依此类推)。很快,它应该满足条件:

struct Type0 {}; struct Type1 {};
BOOST_STATIC_ASSERT( (Fod<Type0>::At<Type0>::value == 0) );
BOOST_STATIC_ASSERT( (Fod<Type0, Type1>::At<Type0>::value == 0) );
BOOST_STATIC_ASSERT( (Fod<Type0, Type1>::At<Type1>::value == 1) );

我试过使用 boost::disable_if如下:

template<class T, class Enable = void>
class At; // undefined

template<>
struct At<S0, typename boost::disable_if<boost::is_same<S0, aux::EmptyType> >::type > {
static const int value = 0;
};

template<>
struct At<S1, typename boost::disable_if<boost::is_same<S1, aux::EmptyType> >::type > {
static const int value = 1;
};

template<>
struct At<S2, typename boost::disable_if<boost::is_same<S2, aux::EmptyType> >::type > {
static const int value = 2;
};

template<>
struct At<S3, typename boost::disable_if<boost::is_same<S3, aux::EmptyType> >::type > {
static const int value = 3;
};

// and so on for S4...S9

但是当我为 S3 定义特化并且 S2、S3 属于同一类型时它会导致错误 aux::EmptyType (或者:我为 S2 定义了专门化,并且 S1、S2 都是同一类型)。

4>C:\phd\cpp\src\boost/dst/fod.hpp(144): error C2766: explicit specialization ; 'boost::dst::fod<S0>::At<boost::dst::aux::EmptyType,boost::mpl::s_item<T,Base>>' has already been defined
4> with
4> [
4> S0=Type0
4> ]
4> and
4> [
4> T=Type0,
4> Base=boost::mpl::set0<>::item_
4> ]

有什么办法解决这个问题吗?如果我想要一个方法 size_t at<S0>()给出 0,size_t at<S1>()给 1...?

请询问您是否需要更多信息。

最佳答案

有一个更简单的解决方案,假设 boost::is_same::value 返回 0 或 1(如果你的 bool 使用不同的值,只需编写一个小的编译时转换器):将您当前的 At 替换为

template <typename T>
struct At {
enum {
value =
boost::is_same<T, S0>::value) +
boost::is_same<T, S1>::value * 10 +
boost::is_same<T, S2>::value * 100
};
};

它的计算结果为十进制位掩码,如果您需要更大的范围,请随意使用其他值。

关于c++ - 编译器错误 C2766: "explicit specialization; ' specialization' has already been defined"when using boost::disable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924325/

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