2016-03-31 35 views
0

這是我發現並描述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>; 
}; 
+0

你真的編譯過了嗎?不要依賴智能感知。 – ZDF

+0

嘗試使用錯誤C2975編譯錯誤:'_Bits':'std :: bitset',期望的編譯時常量表達式無效的模板參數 –

+0

'Count()'需要是函數嗎?爲什麼不'靜態constexpr std :: size_t Count = 3U;'? – ZDF

回答

2

您可能已經注意到,如果您將一行或兩行移動到類體外,錯誤就會消失。您遇到的問題是,直到之後整個類定義已被解析,纔會分析類成員函數定義(甚至是內聯函數)因此,當編譯器看到using Bitset = std::bitset<Count()>;時,此時Count已被聲明,但尚未定義,並且尚未定義的constexpr函數不能用於常量表達式 - 因此您會看到您看到的錯誤。不幸的是,我知道沒有好的解決方案或解決方法。