2015-04-17 51 views
-1

我並沒有真正的聲明標識符。這是我的代碼:簡單C++程序上的多個未聲明的標識符

#include "pugi/pugixml.hpp" 

#include <iostream> 
#include <string> 
#include <map> 

int main() { 
    pugi::xml_document doca, docb; 
    std::map<std::string, pugi::xml_node> mapa, mapb; 

    if (!doca.load_file("a.xml") || !docb.load_file("b.xml")) 
     return 1; 

    for (auto& node: doca.child("site_entries").children("entry")) { 
     const char* id = node.child_value("id"); 
     mapa[id] = node; 
    } 

    for (auto& node: docb.child("site_entries").children("entry")) 
     const char* idcs = node.child_value("id"); 
     if (!mapa.erase(id)) { 
      mapb[id] = node; 
     } 
    } 

    for (auto& ea: mapa) { 
     std::cout << "Removed:" << std::endl; 
     ea.second.print(std::cout); 
    } 

    for (auto& eb: mapb) { 
     std::cout << "Added:" << std::endl; 
     eb.second.print(std::cout); 
    } 

我得到在編譯的時候了不少錯誤,但一個是出現了幾次的誤差error: use of undeclared identifier例如:

  • 的src/main.cpp中:21:25錯誤:使用未聲明的標識符'id' if(!mapa.erase(id)){ ^
  • src/main.cpp:22:18:error:使用未聲明的標識符'id' mapb [id] = node; ^
  • src/main.cpp:22:24:錯誤:使用未聲明的標識符'node' mapb [id] = node;

在閱讀了這個主題後,它似乎在談論不包括沒有字符串的iostream,但我已經這樣做了。

https://stackoverflow.com/a/22197031/1738522

我很新的C++所以任何幫助,將不勝感激。

+2

您是否讀過錯誤消息所指的行?你聲明一個名爲'idcs'的變量,然後將其稱爲'id'。更改一個名稱以匹配其他名稱。 –

+1

而且它似乎也有在第二個for循環中缺少左括號。 – noobProgrammer

+0

在一個語句塊中聲明的變量(例如for for循環)不可用於語句塊外的代碼。因此,第一個for循環中的變量id不能被第二個for循環中的語句訪問。也許錯誤是一個錯字? –

回答

2
#include "pugi/pugixml.hpp" 

#include <iostream> 
#include <string> 
#include <map> 

int main() { 
    pugi::xml_document doca, docb; 
    std::map<std::string, pugi::xml_node> mapa, mapb; 

    if (!doca.load_file("a.xml") || !docb.load_file("b.xml")) 
     return 1; 

    for (auto& node: doca.child("site_entries").children("entry")) { 
     const char* id = node.child_value("id"); 
     mapa[id] = node; 
    } 

    for (auto& node: docb.child("site_entries").children("entry")) { // <-- here 
     const char* idcs = node.child_value("id"); 
     if (!mapa.erase(idcs)) { // <-- here 
      mapb[idcs] = node; // <-- here 
     } 
    } 

    for (auto& ea: mapa) { 
     std::cout << "Removed:" << std::endl; 
     ea.second.print(std::cout); 
    } 

    for (auto& eb: mapb) { 
     std::cout << "Added:" << std::endl; 
     eb.second.print(std::cout); 
    } 

,如果你改變它這個樣子應該沒有問題。

您使用id,你宣佈它爲idcs,你失蹤的左括號for循環

還要注意範圍之內聲明的變量,這意味着{ here }失效一旦範圍被關閉。

如果您計劃使用範圍之外的變量,則需要在函數的開頭聲明它們,或者完全在任何範圍之外聲明它們以使它們成爲全局變量。

2

您在此定義id

for (auto& node: doca.child("site_entries").children("entry")) { 
    const char* id = node.child_value("id"); 
    mapa[id] = node; 
} 

這個循環中,id被破壞後(它超出範圍)

但你嘗試外部訪問它

for (auto& node: docb.child("site_entries").children("entry")) 
{ // you also forgot to put braces here 
    const char* idcs = node.child_value("id"); 
    if (!mapa.erase(id)) { 
     mapb[id] = node; 
    } 
} 

我想你打算使用idcs而不是id

3

好了,你沒有在該範圍內聲明id

for (auto& node: docb.child("site_entries").children("entry")) { // brace added here.. dunno how this compiled 
     const char* idcs = node.child_value("id"); 
     if (!mapa.erase(id)) { 
      mapb[id] = node; 
     } 
    } 

您使用id,如前面的for循環中聲明,而不是idcs

+0

_「不知道它是如何編譯的」_它沒有:) –

+0

@Lighting哈哈,你說得對,我想我想說的是「編譯器怎麼沒有抓到它」,但它可能做到了,OP沒有注意。 – noobProgrammer

+0

我認爲他暗示他還沒有發佈其他錯誤。 –

2
for (auto& node: doca.child("site_entries").children("entry")) { 
    const char* id = node.child_value("id"); 
    mapa[id] = node; 
} 

id具有for循環的範圍。那麼你這樣做:

for (auto& node: docb.child("site_entries").children("entry")) { // you missed that curly bracket 
    const char* idcs = node.child_value("id"); 
    if (!mapa.erase(id)) { 
     mapb[id] = node; 
    } 
} 

id超出了範圍。可能你的意思是idcs而不是id