C++ GCC 的部分模板专用化问题
C++ partial template specialization issue with gcc
我正在尝试在编译时使用模板部分专用化来计算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");
}
谁在这里表现得理智?
如果你想解决问题,我提出以下改进
template <int N, int M, bool = (M != 0) && (N != 0) && (N > M)>
struct GCD;
template <int N, int M>
struct GCD<N, M, true>
{ static constexpr int value { GCD<N%M, M>::value }; };
template <int N, int M>
struct GCD<N, M, false>
{ static constexpr int value { GCD<N, M%N>::value } ; };
template <int M>
struct GCD<0, M, false>
{ static constexpr int value { M }; };
template <int M>
struct GCD<M, 0, false>
{ static constexpr int value { M }; };
如果你想知道g++或clang++是正确的,那么...我不知道在这种情况下编译器可以或必须做什么,所以......我不知道。
确切地说,我不知道,当N > M
和编译器遇到时,
static const int value = (N>M)? GCD<N%M, M>::value : GCD<N, M%N>::value;
如果编译器必须(或可以(仅实现GCD<N%M, M>
,或者是否必须(或可以(实现GCD<N, M%N>
。
无论如何,如果我没错的话,clang++ 只实现了 GCD<N%M, M>
g++ 实现两者。
我的改进是为避免这个问题而量身定制的。
相关文章:
- 警告处理为错误这里有什么问题
- .cpp和.h文件中的模板专用化声明
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- C++部分模板专用化问题
- C++隐式/显式模板方法专用化问题
- C++ GCC 的部分模板专用化问题
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 嵌套类模板专用化问题
- 显式模板专用化和依赖名称查找问题
- 模板专用化和enable_if问题
- 别名模板专用化问题
- 模板专用化问题
- 部分模板专用化有什么问题
- g++中的显式模板专用化导致问题
- C++结构成员模板函数的显式专用化 - 这是一个Visual Studio问题吗?
- 解决函数模板部分专用化问题