解决标准::替换编译错误

Resolve std::replace compile errors

本文关键字:错误 编译 替换 解决 标准      更新时间:2023-10-16

我有下面的代码行

std::string inStr = "I go, I walk, I climb";
std::replace( inStr.begin(), inStr.end(), "I", "you");//C2782

使用上面的代码行,我收到编译错误

error C2782: 'void std::replace(_FwdIt,_FwdIt,const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous

输入参数可能有什么问题?

我相信

错误是因为"I"的类型是const char[2]的,"you"的类型是const char[4]的,而不是您可能期望的char*

数组在需要时衰减到指针,但模板类型推导不会自动执行此操作。

还要记住,使用 std::replace 您将需要替换原始字符串中的单个元素,因此仅使用 char .


"you"替换"I"的简单替代代码片段是;

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    std::string inStr = "I go, I walk, I climb";
    //std::replace( inStr.begin(), inStr.end(), "I", "you");
    auto at = inStr.find("I");
    while (at < inStr.size()) {
        inStr.replace(at, 1, "you");
        at = inStr.find("I");
    }
    cout << inStr << endl;
}

您可以在此处使用 MS 在线编译器来验证代码。

std::replace 用于将容器中的单个元素替换为另一个元素。对于 std::string 上的std::replace,您只能将字符串容器中的一个字符替换为另一个字符

这对

你有用,问题是因为"I"的大小和"You"不同"

replace(inStr.begin(), inStr.end(), 'I', 'Y');

试试这个,

size_t subStrinPos = -1;
do{
    subStrinPos = inStr.find('I', 0);
    if (subStrinPos != -1)
        inStr.replace(subStrinPos, strlen("I"), "You");
} while (subStrinPos != -1);