微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

g++ 和 clang 的静态成员链接错误,但 MSVC 没有

如何解决g++ 和 clang 的静态成员链接错误,但 MSVC 没有

我有一个带有静态数据成员的模板类 C。 C 有一个内部类 D,它使用该静态数据成员来初始化向量。但是我在使用 GNU C++ 11 和 Clang++ 12 而不是使用 MSVC 19 时遇到了未定义的引用链接错误。我可以简化为:

#include <iostream>
#include <vector>

template<class T>
class C {
    using V_t = std::vector<T>;
    using size_type = typename V_t::size_type;

public:
    static const size_type npos = 1234;

    class D {
        C::size_type s;
        std::vector<C::size_type> v;

    public:
        D(C::size_type s,size_t sz) :
            s(s),v(sz,C::npos)  // error
        {
        }

        C::size_type getS() const {
            return s;
        }
    };

    D getD() const
    {
        return D(npos,10);
    }
};

int main()
{
    C<int> c;

    auto d = c.getD();

    std::cout << d.getS();
}

GNU C++ 11 - https://godbolt.org/z/6GG99ne7n

undefined reference to `C<int>::npos

Clang++ 12 - https://godbolt.org/z/GezWboYc7

undefined reference to `C<int>::npos

casting 解决链接错误,但好像不对。

    class D {
        C::size_type s;
        std::vector<C::size_type> v;

    public:
        D(C::size_type s,C::size_type(C::npos))  // fix
        {
        }

        C::size_type getS() const {
            return s;
        }
    };

编辑: C::D::s 未初始化。固定。

编辑:将 npos 声明为内联 (C++17) 解决链接错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。