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