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

时间:2019-12-09 11:28:24

标签: c++ templates static conditional-statements 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 ::`动态初始化程序中为'public:static int const Templ”引用:: value''(void)“(?? __ 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>;

2 个答案:

答案 0 :(得分:1)

问题不在于std::conditional_t,而是简单地即使您使成员变量constexpr并在类中内联初始化它,您仍然需要 define 它。

考虑到您的变量是普通的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>;

答案 1 :(得分:0)

我在https://www.onlinegdb.com/上尝试了此代码,它运行正常。

构建代码时,依赖项存在问题。在您的项目中签出“参考”。您所依赖的库必须标记。如果它是外部库,则应为其添加路径。