隐式模板参数

Max*_*xpm 13 c++ xcode templates implicit

以下代码在Xcode中生成编译错误:

template <typename T>
struct Foo
{
    Foo(T Value)
    {
    }
};

int main()
{
    Foo MyFoo(123);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

error: missing template arguments before 'MyFoo'

更改Foo MyFoo(123);Foo<int> MyFoo(123);修复问题,但编译器是否应该能够找出相应的数据类型?

这是一个编译器错误,还是我误解了隐式模板参数?

Jon*_*pan 12

理论上,构造函数可以推断它正在构造的对象的类型,但声明:

Foo MyFoo(123);
Run Code Online (Sandbox Code Playgroud)

为临时空间分配MyFoo并且必须知道完全限定类型,MyFoo以便知道需要多少空间.

如果您想避免键入(即用手指)特别复杂模板的名称,请考虑使用typedef:

typedef std::map<int, std::string> StringMap;
Run Code Online (Sandbox Code Playgroud)

或者在C++ 0x中,您可以使用auto关键字让编译器使用类型推断 - 尽管许多人认为这会导致可读性更低且更容易出错的代码,我自己就是这样.,p

  • 它可以推断出对构造函数的调用的类型,但不能推断存储空间的类型.如果将变量定义为简单的`Foo`,它是否可以同时包含`Foo <int>`和`Foo <std :: string>`?或者它总是知道它心中的秘密是"Foo <int>"吗?如果变量是`const`则可以实现,因为该值无法重新分配,但是我们对`const T` vs`T`有不同的词法规则,并且随之而来的是大的破坏. (6认同)
  • 如果它可以推断出类型,它可以推断出空间. (5认同)

And*_*hko 8

编译器只能为模板化函数找出模板参数类型,而不是类/结构

  • 毕竟,函数`std :: make_pair <typename T,typename U>(T t,U u)`有一个原因,即使我们已经有了类`std :: pair <typename T,typename U>` . (3认同)