2017-01-01 40 views
3

我想了解模板和具體的變量模板。考慮到這一點:可變模板部分專業化和constexpr

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.

+0

你使用哪種編譯器? –

+0

我正在使用Visual Studio 2015(更新3) – winterlight

+2

GCC 6.3爲第一個片段提供了正確的結果。可能是Visual C++的東西。 – DeiDei

回答

1

我想這是編譯器中的MSVC中的一個錯誤。

根據this頁面變量模板應該可用,因爲MSVC 2015更新2。似乎即使在更新3中它們也無法正常工作。

反正你的代碼工作正常GCC 6.1wandbox

+0

似乎在MSVC 2017 RC中得到修復。 – Oktalist