【问题标题】:Unable to convert template arguments to match function arguments无法将模板参数转换为匹配函数参数
【发布时间】: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&amp; a, const char&amp; 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 &lt;typename T&gt; const T &amp;minD(T const &amp;a, T const &amp;b, T const &amp;c)中你不能调用char *minD(char * a, char * b),因为模板函数中的参数类型是const char*,它可以' t 转换为char*。您需要将minD 的字符串重载更改为采用const char* 参数。

标签: c++ function templates function-parameter


【解决方案1】:

在我的头撞墙很长一段时间后,我能够想出一个解决方案。

事实证明,可能无法修改这 3 个给定函数以匹配这两种情况。

所以,我的解决方案是添加一个重载的 minD 方法:

template <typename T>
const T* minD(const T* a, const T* b, const T* c)
{
    return minD(minD(a, b), c);
}

另外,我用两个 char * 参数更改了 minD 的签名,如下所示:

const char *minD(const char * a, const char * b)

现在,在这次通话中

val = minD(42, 7, 68);

它匹配具有 3 个 const T& 参数的 minD 函数,并从内部调用具有 2 个 const T& 参数的 minD。 但是,在这次通话中

const char *  const s0 = "CSC";
const char *  const s1 = "461";
const char *  const s2 = "Optimized C++";
s = minD(s0, s1, s2);

匹配新增的带有3个char*参数的minD函数,依次调用更新后的带有2个char*参数的minD函数。

因此,它解决了这个问题。

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多