0

分数クラスを作成しようとして遊んでいると、明らかな不具合が見つかりました。このコードは問題を示しています。

クラスは次のとおりです。

template <int A, int B>
struct two_ints
{
    static constexpr int first = A < 100 ? A : -1;
    static constexpr int second = B < 100 ? B : -1;
};


template <typename T>
struct myPair
{
    T one;
    T two;
    template <int A, int B>
    constexpr myPair(two_ints<A, B>)
        : one(two_ints<A,B>::first), two(two_ints<A,B>::second){    }

    template <int A, int B>
    struct make_pair
    {
        static constexpr myPair<T> value = myPair<T>(two_ints<A,B>());
    };
};

テンプレートperameterとして「int」を使用してクラスのオブジェクトを作成すると、問題なくコンパイルされます。

int main()
{
    typedef myPair<long> int_pair;
    int_pair pairTwo(two_ints<67,45>());
    int_pair pairThree(int_pair::make_pair<67,45>::value);

    return 0;
}

しかし、テンプレート パラメーターとして "long long" を使用すると、コンパイルに失敗します。

int main()
{
    typedef myPair<long long int> int_pair;
    int_pair pairTwo(two_ints<67,45>());
    int_pair pairThree(int_pair::make_pair<67,45>::value); //error here

    return 0;
}

エラーは次のとおりです: myPair::make_pair<67, 45>::value への未定義の参照 コンパイラの使用: GNU GCC コンパイラ

編集:さらに複雑にするために、変数の代わりに値と constexpr 関数を作成すると、コードはコンパイルされます...

static constexpr myPair<T> value() { return myPair<T>(two_ints<A,B>()); }

そして、int main()

int_pair pairThree( int_pair::make_pair<67,45>::value() );

これにより、エラーはまったく発生しません。

4

0 に答える 0