2016-03-31 34 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函数不能用于常量表达式 - 因此您会看到您看到的错误。不幸的是,我知道没有好的解决方案或解决方法。