English 中文(简体)
nes名谱法中使用的不完整类型,为什么?
原标题:incomplete type used in nested name specifier, Why?

下面的法典是固定的算术类型的一部分,这样一来它就减少了,而我只能包含这一问题。

namespace MathX
{
typedef signed int    int32;
typedef unsigned int uint32;

typedef signed long long    int64;
typedef unsigned long long uint64;

typedef uint32 mathx_ucomp;
typedef  int32 mathx_scomp;
typedef uint64 mathx_udcomp;
typedef  int64 mathx_sdcomp;

template<typename t>
struct sizeof_ex
{
    static const uint32 value = sizeof(t) * 8;
};

template<uint64 val>
struct is_power_of_2
{
    static const bool value = !(val & (val - 1u));
};

enum type_classes { tc_native,  tc_custom };

enum type_ids { ti_basic_int, ti_basic_float, ti_int_t, ti_uint_t, ti_float_t };

template <typename t>
struct basic_info
{
    static const bool is_signed = (t(-1) == -1);
    static const bool is_integer = (t(3.14) != 3.14);
    static const uint32 num_of_bits = sizeof_ex<t>::value;
    static const uint32 comp_bits = num_of_bits;
    static const type_classes type_class = tc_native;
    static const type_ids type_id = is_integer? ti_basic_int: ti_basic_float;
};

template<typename t>
struct global_int
{
    static const t zero;   
    static const t one;    
    static const t mone;   
    static const t minval; 
    static const t maxval; 

    static const uint32 full_t = is_power_of_2<basic_info<t>::num_of_bits>::value? basic_info<t>::num_of_bits: 0u;
    static const uint32 used_t = full_t - int32(basic_info<t>::type_id == ti_int_t);
    static const bool   sign_t = (full_t != used_t);
    static const uint32 half_t = full_t >> 1u;
    static const uint32 comp_b = is_power_of_2<basic_info<t>::comp_bits>::value? basic_info<t>::comp_bits: 0;
    static const uint32 comp_d = comp_b << 1u;
    static const uint32 comp_c = full_t / comp_b;
};

template<typename t> const t global_int<t>::zero = t(0u);
template<typename t> const t global_int<t>::one  = t(1u);
template<typename t> const t global_int<t>::mone = t(-1);
template<typename t> const t global_int<t>::minval = t(global_int<t>::sign_t? (typename t::ucomp)1 << (global_int<t>::comp_b - 1): 0, 0);
template<typename t> const t global_int<t>::maxval = t(global_int<t>::sign_t? (typename t::ucomp)~0 >> 1: (typename t::ucomp)~0, (typename t::ucomp)~0);

template <uint32 bit_count, typename ut, typename st, typename udt, typename sdt> struct int_t;

template <uint32 bit_count, typename ut, typename st, typename udt, typename sdt>
struct basic_info< int_t<bit_count, ut, st, udt, sdt> >
{
    static const bool is_signed = true;
    static const bool is_integer = true;
    static const uint32 num_of_bits = bit_count;
    static const uint32 comp_bits = sizeof_ex<ut>::value;
    static const type_classes type_class = tc_custom;
    static const type_ids type_id = ti_int_t;
};

template <typename t>
inline void mathx_int_setn(t* me)
{
    for (uint32 i=0; i < global_int<t>::comp_c; ++i) me->comp[i] = (typename t::ucomp)-1;
}


template <typename t>
inline void mathx_int_setz(t* me)
{
    for (uint32 i=0; i < global_int<t>::comp_c; ++i) me->comp[i] = 0;
}

template <typename t, typename u>
inline void mathx_int_iTt(t* me, const u& value)
{
    if (sizeof(t) > sizeof(u))
    {
        if (basic_info<u>::is_signed && ((basic_info<u>::type_id != ti_basic_int && value < global_int<u>::zero) || value < 0))
            mathx_int_setn<t>(me);
        else
            mathx_int_setz<t>(me);

        *(u*)me->comp = value;

        return;
    }

    *me = *(t*)&value;
}

template <typename t>
inline void mathx_int_init(t* me, typename t::ucomp hi, typename t::ucomp rest)
{
    typedef global_int<t> gint;
    for (uint32 i=0; i<gint::comp_c-1; ++i) me->comp[i] = rest;
    me->comp[gint::comp_c-1]=hi;
}

template <uint32 bit_count, typename ut, typename st, typename udt, typename sdt>
struct int_t
{
    typedef ut  ucomp;
    typedef st  scomp;
    typedef udt udcomp;
    typedef sdt sdcomp;

    typedef int_t<bit_count, ut, st, udt, sdt> t;
    typedef global_int<t> gint;

    ut comp[gint::comp_c];

    int_t() {}

    int_t(ut hi, ut rest) { mathx_int_init<t>(this, hi, rest); }

    template<typename u>
    int_t(const u& value)
    {
        if (basic_info<u>::is_integer)
            mathx_int_iTt<t, u>(this, value);
    }
};

typedef int_t<128, mathx_ucomp, mathx_scomp, mathx_udcomp, mathx_sdcomp > int128;

}

在编纂下行时,委员会与以往的法典一致汇编了无问题:

int main()
{
   MahtX::int128 q = 1024;
}

现在我想在<代码>数字_限额/代码>上添加支持 c) 加入以下法典(这是该类的一部分):

#include <limits>
namespace std
{
    using namespace ::MathX;

    template < uint32 bit_count, typename ut, typename st, typename udt, typename sdt>
    class numeric_limits< int_t< bit_count, ut, st, udt, sdt > >
    {
    public:
        typedef int_t< bit_count, ut, st, udt, sdt > t;
        typedef global_int<t> gint;

        static const bool is_specialized = true;
        static t min() throw() { return gint::minval; }
        static t max() throw()  { return gint::maxval; }
        static const int32 digits = gint::used_t;
        static const int32 digits10 = int32(digits * 0.301f);
        static const bool is_signed = true;
        static const bool is_integer = true;
        static const bool is_exact = true;
        static const int32 radix = 2;
    };
}

在编纂以下法典时:

int main()
{
    unsigned b = std::numeric_limits< MathX::int128 >::digits10;
}

the gcc compiler produce the following error: error: incomplete type MathX::int_t<128u, unsigned int, int, long long unsigned int, long long int>::gint used in nested name specifier.

VC++汇编者产生以下错误:error C2039: comp_c: is not a member of MathX:global_int<t>

删除<代码>t的变数声明的类型<代码> 这些准则与它们的定义一样,汇编了没有任何问题,但认为这些内容必须继续存在,而且不能解决问题,也不能找出问题发生的原因。

最佳回答

根据full MSVC10 编辑错误信息:

unsigned b = std::numeric_limits< MathX::int128 >::digits10;

requires instantiation of:

template < uint32 bit_count, typename ut, typename st, typename udt, typename sdt>
class numeric_limits< int_t< bit_count, ut, st, udt, sdt > >
{
public:
    static const int32 digits = gint::used_t;
    static const int32 digits10 = int32(digits * 0.301f);
}

这要求:

template<typename t>
struct global_int
{
    static const uint32 full_t = is_power_of_2<basic_info<t>::num_of_bits>::value? basic_info<t>::num_of_bits: 0u;
    static const uint32 used_t = full_t - int32(basic_info<t>::type_id == ti_int_t);
}

这要求:

template <uint32 bit_count, typename ut, typename st, typename udt, typename sdt>
struct int_t
{
    typedef global_int<t> gint;
    ut comp[gint::comp_c];
}

这要求:

template<typename t>
struct global_int
{
    static const uint32 full_t = is_power_of_2<basic_info<t>::num_of_bits>::value? basic_info<t>::num_of_bits: 0u;
    static const uint32 comp_b = is_power_of_2<basic_info<t>::comp_bits>::value? basic_info<t>::comp_bits: 0;
    static const uint32 comp_c = full_t / comp_b;
}

So, global_int<int_t> can t be instantiated until int_t is instantiated, and int_t can t be instantiated until global_int<int_t> is instantiated. This circular dependency causes it to try anyway without loading the innermost global_int<int_t>, causing an incomplete type error.

解决办法是(显然)使<代码>int_t不取决于global_int<int_t>

此外,尽可能避免<条码>使用和带;名称空间>在座标上,在座标/号内。 这是非法的。

问题回答

暂无回答




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?