使用静态 constexpr 成员的未解析外部符号



>我正在尝试使用 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;
}

我收到以下错误消息:

未解析的外部符号"public: static int const Templ::value" (??$value@I@Templ@@2HB( 在函数"void __cdecl Templ::'dynamic initializer for 'public: static int const Templ::value''(void(" (??__E??$value@I@Templ@@2HB@Templ@@YAXXZ(|

如何正确使用带有模板化静态 constexpr 成员作为条件的conditional_t

根据一些程序员的回答我想出了这个:

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>;

我在 https://www.onlinegdb.com/上尝试了这段代码,它工作得很好。

生成代码时遇到依赖项问题。查看项目中的"参考资料"。必须标记所依赖的库。如果它是一个外部库,你应该添加一个路径。

最新更新