C++11 MinGW 4.9.1共享_ptr和const静态类字段结果“未定义引用” 在VisualStudio2012上,它可以正常工作。 在minGW32 4.9.1上,它说 尝试创建时类的静态常量字段的未定义引用 与make_共享的共享指针。 其他方法: 将此字段复制到int并创建与此int-work共享的。 使用new-work创建类对象。
我的错在哪里?这是因为CItem::CAP是由std::make_共享强调我的: 非正式地说,如果一个对象的地址被获取,或者一个引用被绑定到该对象,则使用odr;如果一个函数被调用,或者一个函数的地址被获取,则使用odr。如果使用odr对象或函数,则其定义必须存在于程序中的某个位置;违反这一点就是链路时间错误 由于通过引用获取其参数,因此这被视为odr使用 这意味着您还需要提供一个类外定义:C++11 MinGW 4.9.1共享_ptr和const静态类字段结果“未定义引用” 在VisualStudio2012上,它可以正常工作。 在minGW32 4.9.1上,它说 尝试创建时类的静态常量字段的未定义引用 与make_共享的共享指针。 其他方法: 将此字段复制到int并创建与此int-work共享的。 使用new-work创建类对象。,c++,c++11,static,constants,mingw32,C++,C++11,Static,Constants,Mingw32,我的错在哪里?这是因为CItem::CAP是由std::make_共享强调我的: 非正式地说,如果一个对象的地址被获取,或者一个引用被绑定到该对象,则使用odr;如果一个函数被调用,或者一个函数的地址被获取,则使用odr。如果使用odr对象或函数,则其定义必须存在于程序中的某个位置;违反这一点就是链路时间错误 由于通过引用获取其参数,因此这被视为odr使用 这意味着您还需要提供一个类外定义: #include <memory> class CItem { private:
#include <memory>
class CItem
{
private:
int m_inner;
public:
static const int CAP = 1;
CItem(int temp) : m_inner(temp) {}
};
typedef std::shared_ptr<CItem> TPItem;
int main()
{
int tttt = CItem::CAP;
CItem *temp = new CItem(CItem::CAP);
TPItem temp2(temp);
TPItem temp3 = std::make_shared<CItem>(tttt);
TPItem temp4 = std::make_shared<CItem>(CItem::CAP); //On MinGW there error: "undefined reference to `CItem::CAP'"
return 0;
}
或者避免使用odr,例如在这种情况下:
const int CItem::CAP ;
立即应用左值到右值的转换 您认为可以通过在std::make_中包装CItem::CAP并与intCItem::CAP共享,或者提供类似的静态getter来解决这个问题吗?make_shared随后将转发一个常量副本,因此CItem::CAP将保持odr未使用。@Kaboissonneult当然,这看起来很好,它与std::make_SharedTTT非常相似;经过一些实验后对我来说是最好的std::make_sharedintCItem::CAP;
TPItem temp3 = std::make_shared<CItem>(tttt) ;
TPItem temp4 = std::make_shared<CItem>(CItem::CAP);