在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'
。
答案 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}} );