C++ 隐式模板参数
以下代码在Xcode中生成编译错误:C++ 隐式模板参数,c++,xcode,templates,implicit,C++,Xcode,Templates,Implicit,以下代码在Xcode中生成编译错误: template <typename T> struct Foo { Foo(T Value) { } }; int main() { Foo MyFoo(123); return 0; } 模板 结构Foo { Foo(T值) { } }; int main() { 傅美福(123),; 返回0; } 错误:“MyFoo”之前缺少模板参数 改变foomyfoo(123)到foomyfoo(123)
template <typename T>
struct Foo
{
Foo(T Value)
{
}
};
int main()
{
Foo MyFoo(123);
return 0;
}
模板
结构Foo
{
Foo(T值)
{
}
};
int main()
{
傅美福(123),;
返回0;
}
错误:“MyFoo”之前缺少模板参数
改变foomyfoo(123)代码>到foomyfoo(123)代码>修复了这个问题,但是编译器不应该能够找出合适的数据类型吗
这是一个编译器错误,还是我误解了隐式模板参数?构造函数在理论上可以推断它正在构造的对象的类型,但语句:
Foo MyFoo(123);
正在为MyFoo
分配临时空间,必须知道MyFoo
的完全限定类型,才能知道需要多少空间
如果您想避免键入(即用手指)一个特别复杂的模板的名称,请考虑使用<代码> TyBuffs:
typedef std::map<int, std::string> StringMap;
typedef std::map StringMap;
或者在C++0x中,您可以使用auto
关键字让编译器使用类型推断——尽管许多人会认为这会导致可读性较差、更容易出错的代码,我也是其中之一;p编译器只能为模板化函数计算模板参数类型,而不能为类/结构计算模板参数类型这不是一个bug,它是不存在的特性。在实例化过程中,您必须完全指定类/结构模板参数,始终不会像函数模板那样推断类型。编译器可以推断模板参数,例如:
template<typename T>
void fun(T param)
{
//code...
}
fun(100); //T is deduced as int;
fun(100.0); //T is deduced as double
fun(100.0f); //T is deduced as float
Foo<int> foo(100);
fun(foo); //T is deduced as Foo<int>;
Foo<char> bar('A');
fun(bar); //T is deduced as Foo<char>;
模板
虚无乐趣(T参数)
{
//代码。。。
}
乐趣(100);//T被推导为int;
乐趣(100.0)//T被推导出为双
乐趣(100.0f)//T被推导为浮点数
富富(100),;
乐趣(富);//T被推断为Foo;
富吧(“A”);
娱乐(酒吧)//T被推断为Foo;
实际上,模板参数推导是一个庞大的主题。请在ACCU阅读本文:
这很有意义,因为Foo不是一个类,只是Foo
,其中T是一个类型
在C++0x中,您可以使用auto,您可以创建一个函数使您成为一个Foo,我们称之为Foo(小写f)。那你会做的
template<typename T> Foo<T> foo(int x)
{
return Foo<T>(x);
}
auto myFoo = foo(55);
模板Foo Foo(int x)
{
返回Foo(x);
}
自动myFoo=foo(55);
在C++11中,可以使用decltype
:
int myint = 123;
Foo<decltype(myint)> MyFoo(myint);
int-myint=123;
foomyfoo(myint);
> p>现在你所做的工作在C++ 17中工作。在C++ 17中可以推断模板参数。
template <typename T>
struct Foo
{
Foo(T Value)
{
}
};
int main()
{
Foo a(123);
Foo b = 123;
Foo c {123};
return 0;
}
模板
结构Foo
{
Foo(T值)
{
}
};
int main()
{
fooa(123);
foob=123;
Foo c{123};
返回0;
}
毕竟,函数std::make_pair(T,U)
是有原因的,即使我们已经有了类std::pair
。如果它可以推断类型,它可以推断空间。它可以推断调用构造函数的类型,但不能推断存储空间的类型。如果将变量定义为简单的Foo
,它是否可以同时包含Foo
和Foo
?或者它总是知道它在内心深处是一个Foo
?如果变量是const
,那么它就可以实现,因为不能重新分配值,但是const T
和T
会有不同的词汇规则,然后会发生巨大的破坏。“键入(即用手指)”是一个宝石:DPerhaps你的意思是:“模板Foo Foo(tx)”?