Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 模板代码returntype重载未编译。怎么了_C++_Templates_Return Type_Overloading - Fatal编程技术网

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);

嗯,您收到的是什么错误消息?刚刚用错误消息更新。很抱歉早些时候错过了错误消息。嗯,您收到的是什么错误消息?刚刚用错误消息更新。很抱歉早些时候错过了错误消息