作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力理解模板,特别是变量模板。考虑一下:
template<int M, int N>
const int gcd1 = gcd1<N, M % N>;
template<int M>
const int gcd1<M, 0> = M;
std::cout << gcd1<9, 6> << "\n";
它打印出错误的 0
。但是,如果我使用 constexpr
而不是上面的 const
,我会得到正确的答案 3
。我再次使用结构模板得到正确答案:
template<int M, int N>
struct gcd2 {
static const int value = gcd2<N, M % N>::value;
};
template<int M>
struct gcd2<M, 0> {
static const int value = M;
};
std::cout << gcd2<9, 6>::value << "\n";
我做错了什么?
编辑:gcd1
也可以在没有基本案例特化的情况下正常编译。怎么会?我正在使用 Visual Studio 2015。
最佳答案
我想这是 MSVC 编译器中的一个错误。
根据 this自 MSVC 2015 更新 2 以来,页面变量模板应该可用。似乎即使在 更新 3 中它们也无法正常工作。
无论如何,您的代码在 gcc 6.1 下运行良好:wandbox
关于c++ - 变量模板偏特化和 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418432/
我是一名优秀的程序员,十分优秀!