【发布时间】:2017-06-19 09:57:34
【问题描述】:
我正在尝试在编译时使用模板部分专业化计算 GCD。 以下代码适用于 clang3.8 但不适用于 gcc7.1。使用 GCC,它会在没有意识到终止大小写的情况下进入递归模板实例化。
template <int N, int M>
struct GCD{
static const int value = (N>M)? GCD<N%M, M>::value : GCD<N, M%N>::value;
};
template <int M>
struct GCD<0, M>{
static const int value = M;
};
template <int M>
struct GCD<M, 0>{
static const int value = M;
};
int main()
{
static_assert(GCD<12,15>::value == 3, "Error");
}
谁在这里表现得理智?
【问题讨论】:
-
也许只做两个参数
GCD结构的前向声明,定义在特化下面。因为在第一次定义时,编译器并不真正了解这两个专业。我不知道哪个编译器是正确的。 -
请注意,在 C++17 中,
<numeric>标头中会有一个gcd函数。 -
你的数学在这里不行。
标签: c++ c++11 gcc clang template-meta-programming