Ошибки компиляции при неправильном использовании nullptr - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь найти решение, представленное в этой SO Q / A Ошибка компилятора при использовании shared_ptr с указателем на указатель , и я не могу использовать решение, предоставленное надлежащим образом.Я все еще получаю ошибки компиляции в Ubuntu 18.04 с g ++ версии 7.3

Вот мой минимальный полный проверяемый пример для воспроизведения проблемы

test.h

# include <memory> 
using std::shared_ptr;
using std::unique_ptr;
struct DataNode
{
 shared_ptr<DataNode> next;
} ;


struct ProxyNode
{
 shared_ptr<DataNode> pointers[5];
} ;


struct _test_
{
  shared_ptr<shared_ptr<ProxyNode>> flane_pointers;
};

test.cpp

 #include <stdint.h>
 #include "test.h"


 shared_ptr<DataNode> newNode(uint64_t key);
 shared_ptr<ProxyNode> newProxyNode(shared_ptr<DataNode> node);
 struct _test_ test1;
 int main(void)
 {

   test1.flane_pointers(nullptr);
   shared_ptr<DataNode> node = newNode(1000);
 }

 shared_ptr<ProxyNode> newProxyNode(shared_ptr<DataNode> node) {

 shared_ptr<ProxyNode> proxy(new ProxyNode());
 return proxy;
 }


 shared_ptr<DataNode> newNode(uint64_t key) {

 shared_ptr<DataNode> node(new DataNode());
 return node;
 }

Это ошибка, которую я получаю

    test.cpp: In function ‘int main()’:
    test.cpp:11:31: error: no match for call to   ‘(std::shared_ptr<std::shared_ptr<ProxyNode> >) (std::nullptr_t)’
    test1.flane_pointers(nullptr);
                                ^

Что еще вы пробовали?

Я попытался инициализировать nullptr в заголовочном файле также

  struct _test_
  {
   shared_ptr<shared_ptr<ProxyNode>> flane_pointers(nullptr);
  };

Но это тоже не сработало.Где я иду не так?

Моя цель

Все, что я пытаюсь сделать, это следующее - я пытаюсь инициализировать flane_pointers, который является вектором указателей наnullptr.Объявление было сделано в заголовочном файле относительно его типа, и я пытаюсь инициализировать его в файле .cpp.При этом я получаю вышеупомянутые ошибки компиляции.

   flane_pointers(nullptr)

UPDATE

Может ли какой-либо из ответов объяснить, была ли инициализация в этой ошибке компилятора прииспользование shared_ptr с указателем на указатель правильно или нет?

  std::shared_ptr<std::shared_ptr<ProxyNode> > ptr2ptr2ProxyNode(nullptr);

Для меня (и я новичок в C ++) эта инициализация также выглядит как вызов функции.Это неправильно?

Ответы [ 3 ]

2 голосов
/ 15 апреля 2019

На этой строке:

test1.flane_pointers(nullptr);

Вы пытаетесь вызвать flane_pointers, как если бы это была функция-член. shared_ptr нельзя вызывать как функцию, поэтому вы получаете ошибку компилятора.

Если вы хотите инициализировать flane_pointers, вы можете просто присвоить ему:

test1.flane_pointers = nullptr; 

Или же вы можете выполнить задание при создании test1:

// Initialize test1 with a nullptr
_test_ test1{nullptr}; 
1 голос
/ 15 апреля 2019

Линия

test1.flane_pointers(nullptr);

лечится вызовом функции. Это источник ошибки. Вместо этого используйте назначение.

test1.flane_pointers = nullptr;

И

shared_ptr<shared_ptr<ProxyNode>> flane_pointers(nullptr);

не является допустимой формой инициализации внутри члена. Вы можете использовать

shared_ptr<shared_ptr<ProxyNode>> flane_pointers{nullptr};

или

shared_ptr<shared_ptr<ProxyNode>> flane_pointers = nullptr;
1 голос
/ 15 апреля 2019

Если вы хотите инициализировать flane_pointers до nullptr, вам следует использовать инициализацию приведенной ниже формы:

shared_ptr<shared_ptr<ProxyNode>> flane_pointers = nullptr;

в struct _test_

или

test1.flane_pointers = nullptr; 

in main.

Другая форма инициализации, которую вы пытаетесь выполнить, интерпретируется как вызов функции в main и как объявление функции в struct _test_.

В связанном посте

 std::shared_ptr<std::shared_ptr<ProxyNode> > ptr2ptr2ProxyNode(nullptr);

находится в main и может интерпретироваться только как объявление переменной, а не как вызов функции, потому что у нее нет синтаксиса вызова функции, поскольку переменной предшествуеттип std :: shared_ptr>.

Чтобы избежать путаницы, лучше (начиная с C ++ 11) объявлять и инициализировать переменные с помощью инициализатора, заключенного в скобки {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...