gpt4 book ai didi

c++ - 模板代码返回类型重载未编译。怎么了

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:08 25 4
gpt4 key购买 nike

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

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

这是错误信息:

test2.cpp: In function 'int main()':
test2.cpp:73: error: no matching function for call to 'getFieldOffset(STR1&, int)'
test2.cpp:75: error: no matching function for call to 'getFieldOffset(STR2&, int)'

test2.cpp: 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);

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

但是,如果您使用编写的函数模板,则必须为两个模板参数提供实参。您应该交换模板参数列表中 T1T2 的位置,这样您只需指定 T2:

template <typename T2, typename T1> 
T2 getFieldOffset(const T1& t, int i);

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

template <typename TReturn, typename T> 
TReturn getFieldOffset(const T& t, int i);

现在你可以这样调用它:

getFieldOffset<ReturnType>(str1,0); 

关于c++ - 模板代码返回类型重载未编译。怎么了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5623931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com