以下代码在 Xcode 中生成编译错误:
template <typename T>
struct Foo
{
Foo(T Value)
{
}
};
int main()
{
Foo MyFoo(123);
return 0;
}
error: missing template arguments before 'MyFoo'
更改 Foo MyFoo(123);
至Foo<int> MyFoo(123);
解决了这个问题,但编译器不应该能够找出适当的数据类型吗?
这是编译器的错误,还是我误解了隐式模板参数?
最佳答案
构造函数理论上可以推断出它正在构造的对象的类型,但是语句:
Foo MyFoo(123);
正在为 MyFoo
分配临时空间,并且必须知道 MyFoo
的完全限定类型才能知道需要多少空间。
如果您想避免输入(即用手指)特别复杂的模板的名称,请考虑使用 typedef
:
typedef std::map<int, std::string> StringMap;
或者在 C++0x 中,您可以使用 auto
关键字让编译器使用类型推断——尽管许多人会认为这会导致代码可读性降低且更容易出错,我自己就是其中之一. ;p
关于c++ - 隐式模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4947294/