问题描述
我有一个带有静态数据成员的模板类 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
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 (将#修改为@)