Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

C++11 MinGW 4.9.1共享_ptr和const静态类字段结果“未定义引用” 在VisualStudio2012上,它可以正常工作。 在minGW32 4.9.1上,它说 尝试创建时类的静态常量字段的未定义引用 与make_共享的共享指针。 其他方法: 将此字段复制到int并创建与此int-work共享的。 使用new-work创建类对象。

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:

我的错在哪里?

这是因为CItem::CAP是由std::make_共享强调我的:

非正式地说,如果一个对象的地址被获取,或者一个引用被绑定到该对象,则使用odr;如果一个函数被调用,或者一个函数的地址被获取,则使用odr。如果使用odr对象或函数,则其定义必须存在于程序中的某个位置;违反这一点就是链路时间错误

由于通过引用获取其参数,因此这被视为odr使用

这意味着您还需要提供一个类外定义:

#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);