我正在尝试使用VC ++ 2017编译此(C ++ 14)代码。
#include <type_traits>
#include <limits>
struct Templ
{
template <typename T>
static constexpr int value = ( std::numeric_limits<T>::min() == 0 );
};
using type = std::conditional_t<Templ::value<unsigned>, bool, double>;
int main()
{
return 0;
}
我收到以下错误消息:
在函数“ void __cdecl Templ ::`为'public:static int const Templ :: value的动态初始化程序”中引用的未解析的外部符号“ public:static int const Templ :: value”(?? $ value @ I @ Templ @@ 2HB) ”(无效)”(?? __ E ?? $ value @ I @ Templ @@ 2HB @ Templ @@ YAXXZ)|
如何将
conditional_t
与模板化的静态constexpr成员作为条件正确使用?编辑。基于一些程序员的回答,我想到了:
struct Templ
{
template<typename T>
struct inner
{
enum
{
value = ( std::numeric_limits<T>::min() == 0 )
};
};
};
using type = std::conditional_t<Templ::inner<unsigned>::value, bool, double>;
最佳答案
问题不在于std::conditional_t
,而是简单地,即使您使成员变量constexpr
并在类中内联初始化它,您仍然需要对其进行定义。
考虑到变量是普通的int
,一个简单的解决方案是改用枚举。但是,您需要改为将结构Templ
用作模板:
template <typename T>
struct Templ
{
enum
{
value = (std::numeric_limits<T>::min() == 0)
};
};
using type = std::conditional_t<Templ<unsigned>::value, bool, double>;
关于c++ - 使用静态constexpr成员的未解析外部符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59247919/