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 (将#修改为@)