我在c ++中有一个结构,它是这样的:
struct mystruct {
template <typename T>
T myproc() {
std::cout << "RETURNING T";
return T();
}
};
现在这个结构已经存在(这只是精确结构的示例副本),我需要使用它。我要做的是调用方法myproc()
,如下所示:
int _tmain(int argc, _TCHAR* argv[])
{
mystruct dummystruct;
int y = dummystruct.myproc();
return 0;
}
但它给了我这个编译错误:
error C2783: 'T mystruct::myproc(void)' : could not deduce template argument for 'T'
see declaration of 'mystruct::myproc'
我知道是因为编译器无法知道什么是T
。
所以我的问题是,结构中的函数声明是否合适?我不这么认为,但是这段代码已经存在于我们的一个旧代码中,所以我认为我应该得到别人的意见。
所以我知道这是错的,但是如果有人认为它是正确的,那么请解释我如何使用它。
答案 0 :(得分:5)
T
代表一种类型,例如int
。当return T;
为return int;
时,写T
与int
相同。 return int;
有效吗?
您可以将功能模板调用为:dummy.myproc<int>();
。您必须通过撰写T
来告诉它<int>
是什么。但是,如果函数采用T
参数,那么编译器将能够通过查看参数的类型来推断出T
是什么。例如,dummy.myproc(2.3)
将T
解析为double
,因为2.3
是双倍的。
答案 1 :(得分:5)
我实际上对编译感到惊讶(如果最初这样做了吗?)。
模板可以被认为是一种类型。你不会回来一个类型吗?
您的代码可以这样看。
struct mystruct {
int myproc() {
std::cout << "RETURNING INT";
return int;
}
};
哪个非常有效。
如果要返回默认构造值,则需要添加括号。
struct mystruct {
template <typename T>
T myproc() {
std::cout << "RETURNING T";
return T();
}
};
但是,由于模板参数在s.myproc()
的上下文中无法导出,因此您必须执行s.myproc<mytype>()
。