【发布时间】:2018-04-28 22:31:45
【问题描述】:
我正在尝试使用placement new 创建一个对象(我知道使用智能指针,这只是为了学习)。我的代码如下:
#include <vector>
#include <iostream>
#include <memory>
using namespace std; // please excuse this
// if you change like 19 to arr1 (or any other var name) instead of arr and line 40 to arr1 then it works
struct A
{
int in = 999;
A()
{cout << "A ctor\n";}
~A()
{cout << "A dtor\n";}
};
char arr[sizeof(A)];
class B
{
public:
static char arr[sizeof(A)];
const static A* a_obj;
B()
{
cout << "B ctor\n";
//cout << (a_obj->in) << endl;
}
~B()
{
cout << "B dtor\n";
}
};
const A* B::a_obj = new(arr) A;
int main()
{
B g;
}
我创建了一个名为 arr 的 global array 和另一个名为 arrin B 的 array。当我做我的placement new 时,使用的arr 似乎来自类,因为我得到了我认为的链接器错误。
为什么会这样?为什么不使用global arr?如果我将placement new 更改为使用我重命名的global array 它可以工作。我认为这与lookups 有关系,但我没有具体的答案。
【问题讨论】:
-
请分享链接器错误。
-
请阅读good C++ book。它应该解释范围、它们之间的变量阴影以及如何解决它。解决它们的一种方法是范围解析运算符 (
::),您可以通过它在全局范围内使用arr,如下所示:::arr。 -
您可以使用
::arr和B::arr消除歧义。
标签: c++ c++11 scope static initialization