2017-09-05 52 views
0

我試圖在variadic模板中實現一個元函數(?),以便在編譯時計算幾個類型的最大值sizeofvariadic模板中的最大元函數大小

template<typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = 0; 
}; 

template<typename T, typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value); 
}; 

但我發現了一些奇怪的錯誤:

MaxSizeof.h(7): error C3855: 'MaxSizeof': template parameter 'Ts' is incompatible with the declaration 
MaxSizeof.h(7): error C2977: 'MaxSizeof': too many template arguments 
MaxSizeof.h(5): note: see declaration of 'MaxSizeof' 

能不能幫我修的代碼?

編譯器是MSVC++ 2017工具集v141。

+3

你在constexpr之前缺少**靜態**? – Phil1970

+0

@ Phil1970,謝謝,我已經更新了代碼和錯誤消息。 –

回答

3

您的專業有不正確的語法,它應該是:

template<typename T, typename... Ts> 
struct MaxSizeof<T, Ts...> { // Note the <T, Ts...> here 
    // .... 
}; 
+0

是的,謝謝,我只是想到了這一點。 –

0

std::max自C++ 14以來只標記爲constexpr,所以你必須自己寫。此外,你不能重載結構,這是你的代碼失敗的原因之一。

這是一個需要C++ 14的std::max的解決方案,您可以根據需要更改它以使用自定義的一個。

template<typename... Ts> 
struct MaxSizeof : std::integral_constant<std::size_t, std::max({sizeof(Ts)...})> {}; 
+0

但在這裏http://eli.thegreenplace.net/2014/variadic-templates-in-c/在第一個例子「Varidic數據結構」下,作者似乎重載了一個結構體,不是嗎? –

+0

@SergeRogatch如果你是第一個,那是一個功能。後面有一個結構,這是部分專業化。 – Rakete1111

0

有2個修復需要:

  1. 正如@指出Phil1970,我忘了staticvalue定義。
  2. 我必須在第7行指定模板參數:struct MaxSizeof<T, Ts...> {而不是簡單的struct MaxSizeof {

所以下面的代碼編譯:

template<typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = 0; 
}; 

template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> { 
    static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value); 
}; 
0

需要另一個次要的修復:

template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> { 
    static constexpr size_t value = std::max(sizeof(T), MaxSizeof<Ts...>::value); // there should be with no `typename` 
};