1

struct Fractionコンパイル時に基本的な操作を行うように記述しようとしています。これは実際の目的には役立たないことに注意してください。私はこれを演習としてのみ行います。

私はこれから始めました:

namespace internal
{
    // Euclid algorithm
    template <int A, int B>
    struct gcd
    {
        static int const value = gcd<B, A % B>::value;
    };

    // Specialization to terminate recursion
    template <int A>
    struct gcd<A, 0>
    {
        static int const value = A;
    };
}

template <int Numerator, int Denominator>
struct Fraction
{
    // Numerator and denominator simplified
    static int const numerator = Numerator / internal::gcd<Numerator, Denominator>::value;
    static int const denominator = Denominator / internal::gcd<Numerator, Denominator>::value;

    // Add another fraction
    template <class Other> struct add
    {
        typedef Fraction<
            Numerator * Other::denominator + Other::numerator * Denominator,
            Denominator * Other::denominator
        > type;
    };
};

これはコンパイルして動作しますFraction<1,2>::add< Fraction<1,3> >::type: Fraction<5,6>今、私は減算を追加しようとしました:

template <class Other>
struct sub
{
    typedef typename Fraction<Numerator, Denominator>::add<
        Fraction<-Other::numerator, Other::denominator>
    >::type type;
};

しかし、理解できないコンパイルエラーが発生します:

Error: "typename Fraction<Numerator, Denominator>::add" uses "template<int Numerator, int Denominator> template <class Other> struct Fraction::add" which is not a type

誰かがコンパイラが何を言っているのか、なぜ私がやりたいことをすることが許されていないのかを説明できますか? ちなみに使っg++ 4.4.6ています。

4

1 に答える 1

5

テンプレート キーワードを使用します。

template <class Other>
struct sub
{
    typedef typename Fraction<Numerator, Denominator>::template add<
        Fraction<-Other::numerator, -Other::denominator>
    >::type type;
};

http://liveworkspace.org/code/26f6314be690d14d1fc2df4755ad99f6

この「テンプレート」と「タイプ名」のキーワードをどこに、なぜ配置する必要があるのか​​ を読んでください。より良い説明のために。

于 2012-10-25T12:25:44.713 に答える