在 Mac 上的 Xcode 中使用 libc++(GNU++11 方言)、LLVM 编译器。
我有一个结构如下:
struct Vertex
{
float position[3];
float colour[4];
float normal[3];
};
Run Code Online (Sandbox Code Playgroud)
目前我正在堆上创建一个实例,如下所示:
Vertex *vertex = new Vertex({{0.1f, 0.1f, 0.1f},
{0.0f, 0.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 0.0f}} );
Run Code Online (Sandbox Code Playgroud)
不过我想创建一个共享指针。下面的代码是最好的方法吗?
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);
Run Code Online (Sandbox Code Playgroud)
或者我应该在创建共享指针之前创建Vertex
using ?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}} );
Run Code Online (Sandbox Code Playgroud)
按照建议,但我收到错误no matching function for call to 'make_shared'
。
在第一个代码片段(更新之前的代码片段)中,std::make_shared
将为新的代码片段分配内存Vector
并使用给定的参数构造它v
,在本例中为复制构造。它会工作得很好。
第二个代码片段(在您的更新中)不起作用,因为编译器无法推导出与参数匹配的正确类型。函数模板 std::make_shared 声明为:
template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
Run Code Online (Sandbox Code Playgroud)
这个问题可以通过“转换”来解决。
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}} );
Run Code Online (Sandbox Code Playgroud)