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'未在此范围内声明
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)
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |