【发布时间】:2020-09-12 10:13:41
【问题描述】:
我在一个头文件中有 3 个函数
template <typename T>
const T &minD(T const& a, T const& b)
{
if (a > b)
{
return b;
}
else
{
return a;
}
}
这是我试图将参数与参数匹配的目标函数
char *minD(char * a, char * b)
{
if (strcmp(a, b) > 0)
{
return b;
}
else
{
return a;
}
}
这是一个函数,必须根据参数类型调用上面编写的两个函数。
template <typename T>
const T &minD(T const &a, T const &b, T const &c)
{
return minD(minD(a, b), c);
}
我的目标是,如果上述函数中的给定参数与 char* 类型匹配,则必须调用具有 char* 类型参数的 minD。如果参数类型是任何其他类型,则应调用具有模板类型参数的第一个函数。
我做的第一件事是尝试调用 minD(minD(&a, &b), &c) 并将 function2 更改为 const char *minD(const char * a, const char * b),但编译器说无法将 const T * 转换为 const char *。
我做的第二件事是尝试将第二个函数的参数类型更改为
const char * minD(const char& a, const char& b) 并使用 minD(minD(a, b), c) 调用函数,但随后编译器抛出一个错误,说明从 const T 到 const char 转换可能会丢失数据。
这里要注意的一点是我不能改变参数类型
template <typename T>
const T &minD(T const &a, T const &b, T const &c)
示例函数调用:
val = minD(42, 7, 68);
这个调用是对第三个函数的函数调用,然后第三个函数必须调用第一个函数才能得到正确的答案。
const char * const s0 = "CSC";
const char * const s1 = "461";
const char * const s2 = "Optimized C++";
s = minD(s0, s1, s2);
这个调用是对第三个函数的函数调用,然后第三个函数必须调用第二个函数才能得到正确的答案。
我无法理解我在这里做错了什么。请帮忙。
【问题讨论】:
-
你为什么不在
minD中使用const char *? -
哦,我是。正如我上面解释的那样,这是我的第一次尝试。它会引发无法将 const T * 转换为 const char * 的错误。
-
我的意思是
const char *minD(const char * a, const char * b)。 -
A
const T不能隐式转换为T。在您的情况下,const char*无法转换为char*。 -
问题是在函数
template <typename T> const T &minD(T const &a, T const &b, T const &c)中你不能调用char *minD(char * a, char * b),因为模板函数中的参数类型是const char*,它可以' t 转换为char*。您需要将minD的字符串重载更改为采用const char*参数。
标签: c++ function templates function-parameter