我的目標是在編譯時計算階乘數組而不創建任何類對象或調用靜態函數。下面是最少的代碼:計算編譯時數組時編譯器相關的錯誤
#include <iostream>
#include <cinttypes>
#include <array>
namespace CompileTime
{
enum {MaxFactorial = 10};
template<size_t N, size_t I = N-1>
class Factorial : public Factorial<N, I-1>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,1> : public Factorial<N, 0>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,0>
{
public:
static const uint64_t value;
static std::array<uint64_t,N> array;
};
template<size_t N>
const size_t Factorial<N,1>::value = Factorial<N,0>::array[1] = 1;
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
template <size_t N, size_t I>
const size_t Factorial<N,I>::value = Factorial<N,0>::array[I] =
I * Factorial<N, I-1>::value;
template <size_t N>
std::array<uint64_t,N> Factorial<N, 0>::array;
template class Factorial<MaxFactorial>;
typedef Factorial<MaxFactorial> PrecomputerFactorial;
}
int main()
{
using CompileTime::PrecomputerFactorial;
for(auto x : PrecomputerFactorial::array)
std::cout << x << std::endl;
std::cout << std::endl;
}
與GCC 5.3.0編譯提供計劃輸出:
0
1
2
6
24
120
720
5040
40320
362880
而且隨着MSVC 2015年:
0
1
0
0
0
0
0
0
0
0
我有兩個問題:一是 ,爲什麼array[0]
具有價值0
在這兩種情況下,儘管被設置爲1
這裏:
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
二,爲什麼MSVC 2015年無法計算呢?
不能回答這兩個問題的觀察:對於GCC 6,計算階乘並在靜態構建時初始化數組,不在編譯時。我想你可能需要在周圍灑一些'constexpr'。 – zwol