這是我發現並描述here的問題的延續。在結構中使用constexpr方法進行模板參數化
假設你有一個包含static constexpr
功能和一個std::bitset
一個類型別名(或任何類型的你希望使用const表達式的結果模板)(如下所示)一個結構:
struct ExampleStruct {
static constexpr std::size_t Count() noexcept {
return 3U;
}
using Bitset = std::bitset<Count()>;
};
視覺Studio 2015版本14.0.25029.00 Update 2 RC突出顯示Count()
紅色呼叫並生成錯誤function call must have a constant value in a constant expression
。
如何才能得到這個編譯,或達到類似的結果?
究竟是什麼導致錯誤在這裏?編譯器是否試圖在const表達式函數之前生成類型別名?
編輯:爲什麼這是行不通的解釋可以在下面找到,但因爲沒有人提供可能的解決方法,這裏有一些,我想出了:
(1)當使用模板,店輸入別名這種類型。
template<typename T>
struct ExampleStruct {
using ThisType = ExampleStruct<T>;
static constexpr std::size_t Count() noexcept {
return 3U;
}
using Bitset = std::bitset<ThisType::Count()>;
};
(2)將Count()
函數移動到結構體的外部。
static constexpr std::size_t Count() noexcept {
return 3U;
}
struct ExampleStruct {
using Bitset = std::bitset<Count()>;
};
(3)更換constexpr
方法與constexpr
成員變量。在constexpr
成員變量
struct ExampleStruct {
static constexpr std::size_t Count = 3U;
using Bitset = std::bitset<Count>;
};
(4)存儲值,並且從Count()
方法返回此。
struct ExampleStruct {
private:
static constexpr std::size_t m_count = 3U;
public:
static constexpr std::size_t Count() noexcept {
return m_count;
}
using Bitset = std::bitset<m_count>;
};
你真的編譯過了嗎?不要依賴智能感知。 – ZDF
嘗試使用錯誤C2975編譯錯誤:'_Bits':'std :: bitset',期望的編譯時常量表達式無效的模板參數 –
'Count()'需要是函數嗎?爲什麼不'靜態constexpr std :: size_t Count = 3U;'? – ZDF