Аргумент по умолчанию для параметра шаблона? - PullRequest
0 голосов
/ 27 января 2019
#include <cstdint>

class MyBar {};
class DifferentBar {};

class Foo{
public:
    template <class Bar = MyBar>
    Foo(uint32_t i) {}
};

int main() {
    auto pFoo1 = new Foo(3);
    auto pFoo2 = new Foo<DifferentBar>(3);
}

Я пытаюсь понять, почему компилятор выдал мне ошибку:

template_ctor.cpp: In function ‘int main()’:
template_ctor.cpp:14:19: error: ‘Foo’ is not a template
  auto pFoo2 = new Foo<DifferentBar>(3);
                   ^~~

Это потому, что аргумент по умолчанию для параметра шаблона действителен только на уровне класса?Как, когда я изменил на:

template <class Bar = MyBar>
class Foo{
public:
    Foo(uint32_t i) {}
};

Он компилируется.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 января 2019

Когда вы пишете

class Foo{
public:
    template <class Bar = MyBar>
    Foo(uint32_t i) {}
};

, вы говорите, что Foo - это не шаблонный класс с конструктором шаблона.

Когда вы пишете

auto pFoo2 = new Foo<DifferentBar>(3);

вы даете Foo параметр шаблона;но Foo - это не шаблонный класс.

Итак, ошибка.

Изменение Foo в классе шаблона с шаблоном параметров по умолчанию

<class Bar = MyBar>
class Foo{
public:
    Foo(uint32_t i) {}
};

youимейте это, теперь new Foo<DifferentBar>(3); является правильным и компилируйте также new Foo(3);, потому что используется параметр шаблона по умолчанию (MyBar).

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