【问题标题】:Error message "deduced conflicting types for parameter 'const T'"错误消息“推断参数'const T'的冲突类型”
【发布时间】:2014-02-21 06:15:05
【问题描述】:

我正在尝试做的事情:

编写上一个练习中的模板的专门版本来处理vector<const char*> 和一个程序 使用这个专业化。

我是这样写程序的:

template<typename T>
int count(vector<T> tvec, const T &t);

template<>
int count(vector<const char *> tvec, const char *const &s)
{
    int count = 0;
    for (auto c : tvec)
        if (c == s) {
            ++count;
        }
    return count;
}

template<typename T>
int count(vector<T> tvec, const T &t)
{
    int count = 0;
    for (auto c : tvec)
        if (c == t) {
            ++count;
        }
    return count;
}

cout << count(svec, "GUO");

但我收到错误提示

deduced conflicting types for parameter ‘const T’ (‘std::basic_string&lt;char&gt;’ and ‘char [4]’)

我想知道如何处理这个问题。再进一步,在模板函数中,似乎可以将数组更改为指针,为什么我的程序无法处理?

【问题讨论】:

  • 顺便说一句。通过运算符 == 比较原始字符串只会比较指针。请改用strcmp()

标签: c++ c++11


【解决方案1】:

不要对这两个参数进行推断,这会导致冲突。写这个:

template <typename T>
int count(const vector<T>& tvec, const typename vector<T>::value_type& t);

另外,考虑重载而不是专门化。专门化一个函数模板几乎不是你想要的。

【讨论】:

    【解决方案2】:

    首先,svec好像被定义为vector&lt;string&gt;,或许应该是vector&lt;const char*&gt;

    其次,明确定义一个var为const char*;

    试试这个:

    vector<const char*> svec;
    const char* chars = "GUO";
    std::cout<<my_count(svec,chars);
    

    BTW: char array(char[]) 类型的变量可以用作 char 类型指针(char*),但是它们作为类型不同,作为模板参数也不同。

    【讨论】:

    • 谢谢,但是如果我想使用文字字符串作为第二个参数,我应该如何实现专门的模板?
    • @user3335905 可以像vector&lt;char[4]&gt; svec;一样定义svec,主模板函数会被调用。因此,您可能需要为char[] 定义一个专门的模板。 char 数组与 char 指针作为数据类型不同。
    • vector&lt;char[4]&gt; svec; 实际上是不可能的,因为 C-Array 不可复制/可移动/可分配。
    • 另一种选择是my_count&lt;const char*&gt;(svec, "GUO")
    • @Jarod42 是的,你是对的。我只是不确定他想要什么结果,因为 svec 元素的operator== 没有意义。
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多