模板参数的明显编译错误

时间:2013-10-24 21:00:42

标签: c++ templates

试图进行分数课程,发现一个明显的故障。 此代码显示了问题,

课程是:

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>());
    };
};

当我使用“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&lt; 67,45&gt; :: 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() );

这完全没有错误。

0 个答案:

没有答案