使用初始化

时间:2017-02-15 13:29:35

标签: c++ struct

在Mac上的Xcode中使用libc ++(GNU ++ 11 dialect),LLVM编译器。

我有一个结构如下:

struct Vertex
{
    float position[3];
    float colour[4];
    float normal[3];
};

目前我正在堆上创建一个实例,如下所示:

Vertex *vertex = new Vertex({{0.1f, 0.1f, 0.1f},
                            {0.0f, 0.0f, 0.0f, 0.0f},
                            {1.0f, 0.0f, 0.0f}} );

但是我想创建一个共享指针。 以下代码是最好的方法吗?

Vertex v = Vertex( {{0.1f, 0.1f, 0.1f},
                    {0.0f, 0.0f, 0.0f, 0.0f},
                    {1.0f, 0.0f, 0.0f}} );

std::shared_ptr<Vertex> vertex = std::make_shared<Vertex>(v);

或者我应该在制作共享指针之前使用Vertex创建new吗?

更新

我尝试了以下内容:

auto vertex = std::make_shared<PCNVertex>( {{0.1f, 0.1f, 0.1f},
                                            {0.0f, 0.0f, 0.0f, 0.0f},
                                            {1.0f, 0.0f, 0.0f}} );

按照建议,但我收到错误no matching function for call to 'make_shared'

1 个答案:

答案 0 :(得分:3)

在第一个代码段(更新前的代码片段)中,std::make_shared将为新Vector分配内存,并使用给定的参数v构建它,在本例中,复制构造。它会正常工作。

第二个代码段(在您的更新中)不起作用,因为编译器无法推断出与参数匹配的正确类型。函数模板std :: make_shared声明为:

template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );

这个问题可以通过&#34;转换&#34;来解决。

auto vertex = std::make_shared<Vertex>(
      Vertex{{0.1f, 0.1f, 0.1f},
             {0.0f, 0.0f, 0.0f, 0.0f},
             {1.0f, 0.0f, 0.0f}} );