1

次のコードは、問題のみを示すために単純化されています

template <unsigned bits_count, typename ut_t = unsigned short, typename st_t = short, typename udt_t = unsigned, typename sdt_t = int>
struct int_t
{
    typedef ut_t     ut;

    ut comp[bits_count / (sizeof(ut) * 8)];
};

template<typename ot, typename it>
inline ot& mathx_int_from_t_to_niv(const it& value, ot& result)
{
    typedef typename it::ut ut;

    result = ot(0);

    if (sizeof(ot) <= sizeof(ut)) return result = ot(value.comp[0]);

    return result = *(ot*)value.comp;
}

template <typename ot, typename it>
ot numeric_cast(const it& value);

template<unsigned bits_count, typename ut_t, typename st_t, typename udt_t, typename sdt_t>
inline int numeric_cast(const int_t<bits_count, ut_t, st_t, udt_t, sdt_t>& value)
{
    typedef int_t<bits_count, ut_t, st_t, udt_t, sdt_t> it;
    int result;

    return mathx_int_from_t_to_niv<int, it>(value, result);
}

typedef int_t<128>  int128;

int main()
{
    int128 s = { { 0 } };
    s.comp[0] = -1;

    int t = numeric_cast<int>(s);
}

上記のコードはエラーでコンパイルされますundefined reference to 'int numeric_cast<int, int_t<128u, unsigned short, short, unsigned int, int> >(int_t<128u, unsigned short, short, unsigned int, int> const&)'

gcc がこのエラーを生成する理由がわかりません。部分的な特殊化を明示的に記述したnumeric_castときに許可されていないと言い、オーバーロードを提供すると未定義の参照と表示されます。

4

1 に答える 1

1

これは、この関数テンプレートの定義を提供していないためです。

template <typename ot, typename it>
ot numeric_cast(const it& value);

次の場合、オーバーロードの解決によって選択されます。

int t = numeric_cast<int>(s);

そして、このオーバーロードが選択されるのは、2 番目のnumeric_castテンプレートが最初のテンプレート引数として型以外の引数を想定しているためです。したがって、それnumeric_cast<int>をインスタンス化する有効な試みではありません。

于 2013-05-13T11:14:37.803 に答える