分享
三行代码  ›  专栏  ›  技术社区  ›  HCSF

模板参数的默认参数? - Default Argument for Template Parameter?

  •  0
  • HCSF  · 技术社区  · 8 月前
    #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 回复  |  直到 8 月前
        1
  •  1
  •   max66    8 月前

    当你写作时

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

    你说 Foo 不是具有模板构造函数的模板类。

    当你写作时

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

    你给 模板参数;但是 不是模板类。

    所以这个错误。

    改变 在具有默认参数模板的模板类中

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

    你现在有了 new Foo<DifferentBar>(3); 是正确的,也可以编译 new Foo(3); 因为使用了默认的模板参数( MyBar )