模板参数的默认参数?

时间:2019-01-27 14:00:36

标签: c++ templates c++17

#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 :(得分:1)

写作时

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

您现在知道new Foo<DifferentBar>(3);是正确的,并且还编译了new Foo(3);,因为使用了默认模板参数(MyBar)。