【问题标题】:Unresolved external symbol using static constexpr member使用静态 constexpr 成员未解析的外部符号
【发布时间】:2020-04-02 11:59:55
【问题描述】:

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

【问题讨论】:

  • 错误消息与您显示的代码不符,因为错误消息提到 Templ::value&lt;double&gt; 而您的代码中没有它。您显示的代码真的是minimal reproducible example,会产生您显示的错误吗?
  • @Someprogrammerdude 抱歉,更新了代码和错误信息。

标签: c++ templates static conditional-statements constexpr


【解决方案1】:

问题不在于std::conditional_t,而只是即使你创建了成员变量constexpr 并在类中内联初始化它,你仍然需要定义它。 p>

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

【讨论】:

  • 谢谢。我想知道为什么即使它没有被 odr 使用(或者是它吗?)也需要定义它。我需要这个值,而不是封闭结构来拥有模板参数 T 所以我稍微修改了一下。查看问题中的结果。您认为这是在 C++14 中完成此任务的推荐方式吗?
【解决方案2】:

我在https://www.onlinegdb.com/ 上尝试了这段代码,它运行良好。

您在构建代码时遇到了依赖问题。查看项目中的“参考”。必须标记您依赖的库。如果它是一个外部库,你应该添加一个路径。

【讨论】:

  • 谢谢。此代码适用于我尝试过的任何 GCC 版本(包括链接上的 GCC 5.4.1)。我的问题特定于 Visual C++ 2017。此代码不依赖于任何其他库。
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多