C++ 模板代码returntype重载未编译。怎么了
我正在尝试使用下面的代码重载一个简单的函数来处理多种类型。但是,它无法编译。有人能告诉我什么地方出了问题,怎么解决吗C++ 模板代码returntype重载未编译。怎么了,c++,templates,return-type,overloading,C++,Templates,Return Type,Overloading,我正在尝试使用下面的代码重载一个简单的函数来处理多种类型。但是,它无法编译。有人能告诉我什么地方出了问题,怎么解决吗 typedef struct str1_type { int f1; int f2; } STR1; typedef struct str2_type { char f1[100]; char f2[100]; }STR2; template <typename T1, typename T2> T2 getFieldOffset(
typedef struct str1_type
{
int f1;
int f2;
} STR1;
typedef struct str2_type
{
char f1[100];
char f2[100];
}STR2;
template <typename T1, typename T2>
T2 getFieldOffset(const T1& t, int i);
int main() {
STR1 str1;
STR2 str2;
int i = getFieldOffset(str1,0);
const char* test = getFieldOffset(str2,0);
}
template <typename T1, typename T2>
T2 getFieldOffset(const T1& t, int i)
{
switch (i) {
case 0:
return t.f1;
case 1:
return t.f2;
default:
{
cout << "Invalid index passed: i" << i << endl;
return null;
}
}
}
typedef结构str1\u类型
{
int f1;
int f2;
}STR1;
typedef结构str2_类型
{
charf1[100];
charf2[100];
}STR2;
模板
T2 getFieldOffset(常数T1&t,int i);
int main(){
STR1-STR1;
STR2-STR2;
int i=getFieldOffset(str1,0);
常量字符*测试=getFieldOffset(str2,0);
}
模板
T2 getFieldOffset(常数T1&t,内部i)
{
开关(一){
案例0:
返回t.f1;
案例1:
返回t.f2;
违约:
{
cout编译器无法推断返回类型。原因之一是getFIeldOffset
可能返回的值不是int
,但可转换为int
。必须指定返回类型的时间:
getFieldOffset<STR2,int>(str2,0);
getFieldOffset(str2,0);
编译器无法推断返回类型。原因之一是getFIeldOffset
可能返回的值不是int
,但可转换为int
。必须指定返回类型的时间:
getFieldOffset<STR2,int>(str2,0);
getFieldOffset(str2,0);
getFieldOffset
是一个函数模板,它采用两种类型的参数。但是在上面的代码中,您没有提供类型参数。您希望编译器对其进行推断。但是编译器只能推断函数参数类型,而不能推断返回类型。因此出现错误
必须同时提供两个类型参数:
int i = getFieldOffset<STR1, int>(str1,0);
const char* test = getFieldOffset<STR2, char*>(str2,0);
inti=getFieldOffset(str1,0);
常量字符*测试=getFieldOffset(str2,0);
但是,如果将函数模板中类型的顺序颠倒为
template <typename T1, typename T2>
T1 getFieldOffset(const T2& t, int i); //T1 (i.e 1st type) becomes returnType!!
模板
T1 getFieldOffset(常数T2&t,int i);//T1(即第一种类型)变为returnType!!
然后,在调用函数时,只能提供一种类型,即返回类型;另一种类型可以从函数参数推导得出:
int i = getFieldOffset<int>(str1,0);
const char* test = getFieldOffset<char*>(str2,0);
inti=getFieldOffset(str1,0);
常量字符*测试=getFieldOffset(str2,0);
getFieldOffset
是一个函数模板,它采用两种类型的参数。但是在上面的代码中,您没有提供类型参数。您希望编译器对其进行推断。但是编译器只能推断函数参数类型,而不能推断返回类型。因此出现错误
必须同时提供两个类型参数:
int i = getFieldOffset<STR1, int>(str1,0);
const char* test = getFieldOffset<STR2, char*>(str2,0);
inti=getFieldOffset(str1,0);
常量字符*测试=getFieldOffset(str2,0);
但是,如果将函数模板中类型的顺序颠倒为
template <typename T1, typename T2>
T1 getFieldOffset(const T2& t, int i); //T1 (i.e 1st type) becomes returnType!!
模板
T1 getFieldOffset(常数T2&t,int i);//T1(即第一种类型)变为returnType!!
然后,在调用函数时,只能提供一种类型,即返回类型;另一种类型可以从函数参数推导得出:
int i = getFieldOffset<int>(str1,0);
const char* test = getFieldOffset<char*>(str2,0);
inti=getFieldOffset(str1,0);
常量字符*测试=getFieldOffset(str2,0);
看起来您应该编写NULL而不是NULL,所有这些都可以正常工作
In function 'T2 getFieldOffset(const T1&, int)': test2.cpp:90: error: 'null' was not declared in this scope
问题是在模板实例化中,由于“null”不正确,编译器无法实例化模板,因此他没有考虑将模板用作函数调用的候选模板。看起来您应该编写null而不是null,所有这些都可以正常工作
In function 'T2 getFieldOffset(const T1&, int)': test2.cpp:90: error: 'null' was not declared in this scope
template <typename T1, typename T2>
T2 getFieldOffset(const T1& t, int i);
问题是在模板实例化中,编译器无法实例化模板,因为“null”不正确,所以他没有考虑将模板用作函数调用的候选模板的能力
template <typename T1, typename T2>
T2 getFieldOffset(const T1& t, int i);
或者,使用更好的模板参数名称:
template <typename TReturn, typename T>
TReturn getFieldOffset(const T& t, int i);
模板
TReturn getFieldOffset(常量T&T,int i);
现在您可以将其称为:
getFieldOffset<ReturnType>(str1,0);
getFieldOffset(str1,0);
或者,使用更好的模板参数名称:
template <typename TReturn, typename T>
TReturn getFieldOffset(const T& t, int i);
模板
TReturn getFieldOffset(常量T&T,int i);
现在您可以将其称为:
getFieldOffset<ReturnType>(str1,0);
getFieldOffset(str1,0);
嗯,您收到的是什么错误消息?刚刚用错误消息更新。很抱歉早些时候错过了错误消息。嗯,您收到的是什么错误消息?刚刚用错误消息更新。很抱歉早些时候错过了错误消息