2016-12-29 12 views
5

У меня есть функция типаКак передать параметр по умолчанию для станд :: shared_ptr <PureVirtualClass>

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger) = 0; 

И я хочу передать параметр по умолчанию с указателем NULL, что-то вроде:

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = NULL) = 0; 

Так что в реализации, если logger NULL, я ничего не делаю с этим, иначе я использую регистратор.

Я пытался искать решение, но не могу найти ..

UPD: Дублированное требование не имеет никакого отношения, я прошу о параметре по умолчанию NULL.

Возможно ли, что gcc 4.4 не поддерживает nullptr?

+1

Вы должны использовать 'nullptr' вместо 'NULL'. Последний является макросом, который, скорее всего, «0», первый является правильным литералом для нулевого указателя. – CoryKramer

+0

Я попытался, но также получил ошибку компиляции: Ошибка: 'nullptr' не был объявлен в этой области –

+0

Этот вопрос не является дубликатом «Возможные параметры виртуальных функций». Тот факт, что функция виртуальна, не имеет отношения к этому вопросу. – IanPudney

ответ

1

С С ++ 11 совместимый компилятор в

Это должно работать либо с NULL или nullptr последний является рекомендуемой формой для C++. Единственное условие заключается в том, что вы скомпилируете его для C++ 11 или выше (см. Комментарий jamek о параметрах командной строки для gcc).

struct B { 
    virtual void foo(int blablabla, std::shared_ptr<LoggerInterface> logger = nullptr) = 0; 
}; 

struct D : B { 
    void foo(int blablabla, std::shared_ptr<LoggerInterface> logger) override { 
     std::cout << "foo: "<<blablabla<<" "<< logger<<std::endl; 
    } 
}; 

int main() { 
    D d; 
    B *b=&d; 
    b->foo(15); 
} 

См online demo

Важное замечание о параметрах по умолчанию

Заметьте, что параметр по умолчанию не присущи самой функции, но и контекст, в котором было объявлено значение по умолчанию. В приведенном выше примере:

  • b->foo(15) работа, так как функция доступна с помощью B класса, для которого определяются параметр по умолчанию.
  • d.foo(15) даже не компилируется, несмотря на то, что они ссылаются на ту же функцию. Это связано с тем, что для класса D я не объявлял значение по умолчанию в определении переопределения.
  • Я мог бы даже иметь другое значение по умолчанию для обоих определений (см в онлайн демо)

Limitated реализации C++ 11 в GCC 4.4

Действительно, nullptr был введен с GCC 4.6, и вам нужно подождать GCC 4.8.1 для full C++11 implementation.

Фактически GCC 4.4.0 был released in 2009, а первый подпункт после официального утверждения стандарта в august 2011 был GCC 4.4.7.

+0

спасибо, но проблема в том, что gcc 4.4 не поддерживает все функции C++ 11, такие как nullptr –

+0

[Действительно] (https: //gcc.gnu .org/projects/cxx-status.html # cxx11): nullptr был введен только с 4.6! – Christophe

+0

@EricAbramov and And [4.4.0 датируется 2009 годом] (https://gcc.gnu.org/gcc-4.4/), а 4.4.7 был первым выпуском после официального утверждения [C++ 11] (https://en.wikipedia.org/wiki/C%2B%2B11) – Christophe

2

Вы можете просто сделать это:

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = {}) = 0; 

Как вы можете видеть here, как пустой конструктор и nullptr дают одинаковый результат, то есть:

Constructs a shared_ptr with no managed object, i.e. empty shared_ptr