尝试制作分数类,发现一个明显的故障。这段代码显示了问题,
课程是:
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<67, 45>::value' 的引用使用编译器:GNU GCC 编译器
编辑:为了使事情进一步复杂化,如果我使用 value 和 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() );
这根本没有错误。