Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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{ 公众: 作废打印(){ std::cout_C++_C++17 - Fatal编程技术网

C++ 模板参数推断失败,使用默认模板参数 #包括 #包括 类MyBar{ 公众: 作废打印(){ std::cout

C++ 模板参数推断失败,使用默认模板参数 #包括 #包括 类MyBar{ 公众: 作废打印(){ std::cout,c++,c++17,C++,C++17,编译器使用它在实例化时拥有的信息进行推导 在new Foo(“abc”,3)的情况下,它实际上只有构造函数参数类型,没有一个是模板化的。因此,您需要使用new Foo(“abc”,3)来明确说明没有指定模板类型,应该使用默认类型 此用法已在C++中,因为默认模板参数类型已被引入。 如果其中一个构造函数参数属于模板类型,则编译器应该能够从该参数推断模板类型。这应该可以编译,并且基本上是这样。这已经修复: structmybar; 模板 福班{ 公众: Foo(常量字符*名称,整数i); }; 自动

编译器使用它在实例化时拥有的信息进行推导

new Foo(“abc”,3)
的情况下,它实际上只有构造函数参数类型,没有一个是模板化的。因此,您需要使用
new Foo(“abc”,3)
来明确说明没有指定模板类型,应该使用默认类型

此用法已在C++中,因为默认模板参数类型已被引入。


如果其中一个构造函数参数属于模板类型,则编译器应该能够从该参数推断模板类型。

这应该可以编译,并且基本上是这样。这已经修复:

structmybar;
模板
福班{
公众:
Foo(常量字符*名称,整数i);
};
自动pFoo1=新Foo(“abc”,3);

该示例在gcc 8.2上失败,但在9上编译。

“abc”
char const[4]
…可能是美中不足的。这似乎与执行
new Foo{“abc”,3}
相关。这在Visual Studio 2017和2019(预览2)“如果其中一个构造函数参数是模板类型…”不是所有的构造函数都考虑CTAD,不管他们是否使用模板参数吗?
#include <cstdint>
#include <iostream>

class MyBar {
public:
    void print() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

template <class Bar = MyBar>
class Foo{
public:
    Foo(const char* name, const uint32_t i) {
        Bar b;
        b.print();
    }
};

int main(int argc, char** argv) {
    auto pFoo1 = new Foo("abc", 3);
}
template_ctor.cpp: In function ‘int main(int, char**)’:
template_ctor.cpp:21:31: error: class template argument deduction failed:
  auto pFoo1 = new Foo("abc", 3);
                               ^
template_ctor.cpp:21:31: error: no matching function for call to ‘Foo()’
template_ctor.cpp:14:2: note: candidate: template<class Bar> Foo(const char*, uint32_t)-> Foo<Bar>
  Foo(const char* name, const uint32_t i) {
  ^~~
template_ctor.cpp:14:2: note:   template argument deduction/substitution failed:
template_ctor.cpp:21:31: note:   candidate expects 2 arguments, 0 provided
  auto pFoo1 = new Foo("abc", 3);
struct MyBar;

template <class Bar = MyBar>
class Foo{
public:
    Foo(const char* name, int i);
};

auto pFoo1 = new Foo("abc", 3);