【问题标题】:Invalid conversion between the same types相同类型之间的无效转换
【发布时间】:2017-05-23 11:01:28
【问题描述】:

我有一个函数可以将向量的元素转换为用逗号分隔的字符串。我希望这个函数适用于 int、float 或 double 等数值,所以我让这个函数接收模板向量:

template <typename T>
std::string ConvertToString(std::vector<T> elements)
{
    std::stringstream stream;
    for(int i = 0; i < elements.size()-1; i++)
    {
        stream << elements[i];
        stream << ",";
    }
    stream <<elements[elements.size()-1];
    return stream.str();
}

然后我声明并填充一个向量:

std::vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);

并尝试调用函数:

std::string convertedString = ConvertToString(values);

现在在调用上述函数行时,我收到以下错误:

错误 C2664:“ConvertToString”:无法将参数 1 从“std::vector<_ty>”转换为“std::vector<_ty>”

我不明白为什么我会收到这个错误,因为提到的类型是相同的。有人能解释一下我哪里错了吗?我怎样才能使函数调用起作用?

非常感谢!

编辑:

我正在使用 Visual Studio 2012。

我的完整代码是这样的:

#include<string>
#include<iostream>
#include<sstream>
#include<vector>

std::string ConvertToString(std::vector<std::string> strings);

int __cdecl main(int argc, char **argv) 
{
    std::vector<int> values;
    values.push_back(1);
    values.push_back(2);
    values.push_back(3);
    values.push_back(4);
    values.push_back(5);

    std::string convertedValues = ConvertToString(values); //here the error occurs

    return 0;
}

template <typename T>
std::string ConvertToString(const std::vector<T> elements)
{
    std::stringstream stream;
    for(int i = 0; i < elements.size()-1; i++)
    {
        stream << elements[i];
        stream << ",";
    }
    stream <<elements[elements.size()-1];
    return stream.str();
}

【问题讨论】:

  • Can't reproduce 与您发布的内容(至少使用 g++)...您可能需要展示更多内容(并告诉我们您使用的是哪个版本的 VS)。
  • 无法用 VS2015、VS2013 和 VS2005 重现
  • @Holt 我已经更新了整个代码,我不知道我还有什么问题。
  • @Danh 谢谢你的信息,我已经添加了完整的代码示例,你现在可以再试一次吗?
  • 这段代码编译出错

标签: c++ templates vector


【解决方案1】:

当你写这个时:

std::string ConvertToString(std::vector<std::string> strings);

...在main 之前,您声明了一个函数ConvertToString,它接受std::vector&lt;std::string&gt; 并返回std::string,所以当您尝试在main 中使用std::vector&lt;int&gt; 调用它时,显然不工作。

编译器在main 中没有看到ConvertToString 的模板化版本,所以它不能调用ConvertToString(std::vector&lt;int&gt;)。将ConvertToString的第一个声明改为:

template <typename T>
std::string ConvertToString(const std::vector<T> elements);

正如其他答案已经提到的,您应该通过 const 引用而不是值来传递:

template <typename T>
std::string ConvertToString(std::vector<T> const& elements);

【讨论】:

    【解决方案2】:

    这是有效的 C++03,因此是编译器错误,或者更可能(我敢)是格式错误的示例。 (考虑从int main() 构建一个示例并提交给编译器供应商)。

    幸运的是,有一种解决方法,无论如何都会好得多。写

    template <typename T> std::string ConvertToString(const std::vector<T>& elements)

    即通过const 引用传递参数,这也将避免向量的深拷贝。

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2021-08-12
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多