模板代码returntype重载不编译.怎么了

Kir*_*ran 1 c++ templates overloading return-type

我正在尝试以下代码来重载一个简单的函数来处理多种类型.但是,它无法编译.有人可以告诉我什么是错的以及如何解决这个问题?

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

test2.cpp:在函数'int main()'中:
test2.cpp:73:错误:没有匹配函数用于调用'getFieldOffset(STR1&,int)'
test2.cpp:75:错误:没有匹配函数用于调用' getFieldOffset(STR2&,int)'

test2.cpp:在函数'T2 getFieldOffset(const T1&,int)':
test2.cpp:90:error:'null'未在此范围内声明

Jam*_*lis 8

template <typename T1, typename T2> 
T2 getFieldOffset(const T1& t, int i); 
Run Code Online (Sandbox Code Playgroud)

只能T1从参数中推导出模板参数,因此T2在进行调用时必须在模板参数列表中显式提供模板参数.

但是,如果使用函数模板编写,则必须为两个模板参数提供参数.你应该互换位置T1,并T2在模板参数列表,这样你只需要指定T2:

template <typename T2, typename T1> 
T2 getFieldOffset(const T1& t, int i);   
Run Code Online (Sandbox Code Playgroud)

或者,使用更好的模板参数名称:

template <typename TReturn, typename T> 
TReturn getFieldOffset(const T& t, int i);  
Run Code Online (Sandbox Code Playgroud)

现在您可以将其称为:

getFieldOffset<ReturnType>(str1,0); 
Run Code Online (Sandbox Code Playgroud)