【问题标题】:Why my compiler is showing some error's that shouldn't exist?为什么我的编译器显示一些不应该存在的错误?
【发布时间】:2016-10-26 11:03:04
【问题描述】:

我有 2 个错误让我感到恶心和困惑。

错误 #1:

错误 C2679:二进制“+=”:未找到采用“std::basic_string<_elem>”类型右侧操作数的运算符(或没有可接受的转换)

这个错误的代码是:

CString lancuch1;   
lancuch1  = "Znaleziono ";
lancuch1  += liczba1.str();
lancuch1  += " pozycji.";

第二个更奇怪:

错误 #2:

错误 C2440:“正在初始化”:无法从“std::_Vector_iterator<_ty>”转换为“std::basic_string<_elem>”

这个错误我已经写了 7 次代码:

for(int i = 0 ; i < pojemnosc_vectora; i++){ 
std::string linijka = (vector.begin()+i); 
char deli = ';'; 
int a = 0; 
for(int i = 0; i<5; i++){ 
std::string pokico = linijka.substr(a, deli); 
vector2.push_back(pokico); 
a+=pokico.length(); 
} 
}
int licznik_komunikatow=0;
for(int i=0; i<vector.size(); i++){
std::string komunikat1 = vector2.begin()+(licznik_komunikatow);
std::string komunikat2 = vector2.begin()+(licznik_komunikatow+1);
std::string komunikat3 = vector2.begin()+(licznik_komunikatow+2);
std::string komunikat4 = vector2.begin()+(licznik_komunikatow+3);
std::string komunikat5 = vector2.begin()+(licznik_komunikatow+4);
CString komun,komun1,komun2,komun3,komun4;
komun = komunikat1.c_str();
komun1 = komunikat2.c_str();
komun2 = komunikat3.c_str();
komun3 = komunikat4.c_str();
komun4 = komunikat5.c_str();
printf("Nazwa: %s \n Cena: %s \n Ilość: %s \n Gdzie: %s \n Kod: %s \n ", komun, komun1, komun2, komun3, komun4 );                   
}

告诉我是我的问题还是 Visual 2005 的问题。我有点厌倦了我不太理解的奇怪错误。任何人都知道如何解决这个问题?

【问题讨论】:

  • "my bad or Visual's 2005 bad" --> 99.98% 的时间,这是编码人员的错误。 (VS 2005 可能是 99.0%)
  • 首先,不要使用 Visual Studio 2005。与较新的版本相比,它确实很旧并且存在大量错误。 VS2015 社区版可免费下载。
  • (vector.begin()+i); 会给你一个迭代器,你必须取消引用才能得到里面的东西。大概是std::string
  • 我想在 Visual 2015 上工作,但由于 Windows CE,我必须在 2005 年完成... .
  • 请缩进您的代码。

标签: c++ mfc visual-studio-2005


【解决方案1】:

第一个非常简单:您试图将 Micrsosoft 的 CStringstd::string 混合在一起,但它们彼此一无所知。作为一般规则,您可能希望选择一个并专门使用它(我更喜欢 std::string 作为规则,但如果您使用的是使用 CString 的 MFC 或 ATL 的其他部分,您可能没有太多选择)。

如果实在无法避免混合使用,可以使用c_str() 来获得CString 知道如何使用的C 风格字符串:

CString lancuch1;   
lancuch1  = "Znaleziono ";
lancuch1  += liczba1.str().c_str();
lancuch1  += " pozycji.";

或(首选):

std::string lanuch1 = "Znaleziono "s  + liczba1.str() + " pozychi."s;

第二,听起来您没有在需要的地方取消引用迭代器,但由于您没有指向生成错误的代码的特定部分,因此很难确定地说更多.可能在这些行中:

std::string komunikat1 = vector2.begin()+(licznik_komunikatow);
std::string komunikat2 = vector2.begin()+(licznik_komunikatow+1);
std::string komunikat3 = vector2.begin()+(licznik_komunikatow+2);
std::string komunikat4 = vector2.begin()+(licznik_komunikatow+3);
std::string komunikat5 = vector2.begin()+(licznik_komunikatow+4);

【讨论】:

  • 第二个是行std::string komunikat1 = vector2.begin()+(licznik_komunikatow);
  • @AnthonyMartial:就像错误所说的那样,您不能将std::vector::iterator 分配给std::string,但这就是您的代码试图做的事情(在许多地方)。您的vector 包含std::string 元素,因此只需取消引用迭代器:std::string komunikat1 = *(vector2.begin()+(licznik_komunikatow));,或停止使用迭代器并改用vector[] 运算符,因为无论如何您都在使用索引:std::string komunikat1 = vector2[licznik_komunikatow];跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2019-08-30
相关资源
最近更新 更多