Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数的默认参数? #包括 类MyBar{}; 类DifferentBar{}; 福班{ 公众: 样板 Foo(uint32_t i){} }; int main(){ 自动pFoo1=新的Foo(3); 自动pFoo2=新的Foo(3); }_C++_Templates_C++17 - Fatal编程技术网

C++ 模板参数的默认参数? #包括 类MyBar{}; 类DifferentBar{}; 福班{ 公众: 样板 Foo(uint32_t i){} }; int main(){ 自动pFoo1=新的Foo(3); 自动pFoo2=新的Foo(3); }

C++ 模板参数的默认参数? #包括 类MyBar{}; 类DifferentBar{}; 福班{ 公众: 样板 Foo(uint32_t i){} }; int main(){ 自动pFoo1=新的Foo(3); 自动pFoo2=新的Foo(3); },c++,templates,c++17,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<DifferentB

我试图理解编译器为什么给我一个错误:

#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:在函数“int main()”中:
模板\u ctor.cpp:14:19:错误:“Foo”不是模板
自动pFoo2=新的Foo(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);
                   ^~~
模板
福班{
公众:
Foo(uint32_t i){}
};
它编译

提前感谢。

当你写信时

template <class Bar = MyBar>
class Foo{
public:
    Foo(uint32_t i) {}
};
class Foo{
public:
    template <class Bar = MyBar>
    Foo(uint32_t i) {}
};
Foo
一个模板参数;但是
Foo
不是模板类

这就是错误所在

使用默认参数模板在模板类中更改
Foo

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

福班{
公众:
Foo(uint32_t i){}
};

你现在有了新的Foo(3)是正确的,并且编译新的Foo(3)MyBar)。

我认为您不能为模板化构造函数指定类型参数,必须对它们进行推断以获得解释。您是否介意演示如何为
Foo
的第一个声明调用构造函数?谢谢@HCSF-简单地
新的Foo(3)
;在第一个声明中,您有一个没有参数的模板构造函数;据我所知,不可能推断出模板类型(没有模板类型推导的参数),也不可能显式地显示它们(因为C++语言没有语法),所以代码>新的FO(3)< /C>只是因为有默认的模板参数(<代码> MyBar < /代码>)。谢谢
<class Bar = MyBar>
class Foo{
public:
    Foo(uint32_t i) {}
};