Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 隐式模板参数_C++_Xcode_Templates_Implicit - Fatal编程技术网

C++ 隐式模板参数

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)

以下代码在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)修复了这个问题,但是编译器不应该能够找出合适的数据类型吗


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

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

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)”?