2017-02-15 4 views
0

Использование libC++ (диалект GNU ++ 11), компилятор LLVM, в Xcode на Mac.Создание общего указателя на новую структуру с инициализацией

У меня есть на структуру следующим образом:

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 прежде, чем сделать общий указатель?

Update

Я попытался следующие:

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

Обычно вы просто заменить 'PCNVertex * vertex' с' авто verte2' и 'новый PCNVertex (...),' 'с станд :: make_shared (...);' – NathanOliver

+0

@NathanOliver I «Я уже это пробовал, я получаю« Ошибка: (140, 19) нет соответствующей функции для вызова «make_shared» –

+1

Какой компилятор вы используете и какие параметры вы используете для компиляции? Включен ли C++ 11? – NathanOliver

ответ

1

В первом фрагменте кода (один прямо перед вашим обновления), std::make_shared будет выделять память для нового Vector и построить его с данным аргументом v, в этом случае, копия построить. Он будет работать нормально.

Второй фрагмент кода (в вашем обновлении) не работает, потому что компилятор не может вывести правильный тип, который соответствует аргументу. Шаблон функции std :: make_shared объявлен как:

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

Эта проблема может быть решена путем «преобразования».

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