2016-06-11 51 views
0

這是我的容器:預計主要表達

std::map<std::string, Node> idents 

節點和變量類:

class Node { 
}; 

template <class T> class Variable : public Node { 
public: 
    T value; 
    Variable(T arg) : value(arg) { } 
    ~Variable(); 
}; 

而且我有這樣的功能:

void assignment(const char * name, const char * val) { 
    if(identifier_exists(name)) 
     printf("exist"); 
     else { 
      try { // Assume `val` is a number 
       double num = std::stod(val); 
       auto variable = new Variable<double>(num); 
       idents.insert(std::pair<std::string, Variable<double>> pair( std::string(name), variable)); 
      } catch (const std::invalid_argument&) { // It's a string 
        auto variable = new Variable<std::string>(val); 
        idents.insert(std::pair<std::string, Variable<std::string>> pair(std::string(name), variable)); 
      } 
     } 
} 

我得到這個編譯時出錯:

node.cpp:20:62: error: expected primary-expression before ‘pair’ 
     idents.insert(std::pair<std::string, Variable<double>> pair( std::string(name), variable));                
                   ^~~~ 
node.cpp:23:67: error: expected primary-expression before ‘pair’ 
     idents.insert(std::pair<std::string, Variable<std::string>> pair(std::string(name), variable));               
                    ^~~~ 

函數必須查看變​​量是否已經存在(按名稱),如果不存在,則將其插入到映射中。變量類用作不同類型值的容器。節點用於創建地圖,而不用將實例化到某個專用變量的值。

+3

嘗試修復編譯器錯誤是浪費時間。編譯錯誤得到解決後,由於[對象切片],此代碼無法工作(http://stackoverflow.com/questions/274626/what-is-object-slicing)。該地圖包含「節點」。嘗試將任何「Node」的子類插入到映射中時,都會將子類沖淡。 C++不是Java。 –

+0

取出加下劃線的單詞'pair'。 (但是也讀過Sam的評論) –

+0

謝謝@SamVarshavchik,我不知道_object slicing_。我會研究這些基本錯誤。 –

回答

3

這裏有幾個問題:

  1. 你試圖插入一個指針(變量=新的變量< ....>),並在地圖不採取指針。相反,您可能需要std::map<std::string, Node*> idents;。通過在地圖上使用指針,也避免,否則你將面對的對象切片問題

  2. 你插入應該像idents.insert(std::pair<std::string, Node*>(name, variable));(即使用節點指針和刪除多餘pair

+0

是的,傳遞std :: pair對象是正確的方法,我使用了'make_pair'。我現在也在使用'Node *',但是我懷疑'Variable'的值如果不是從'Node'繼承的,將無法訪問,因爲'Variable'會被當作'Node'處理。無論如何,謝謝。 –

+0

有幾種方法可以訪問變量的值:1.在基類中創建虛擬訪問器函數。這將需要在變量的子類中進行特定重寫。 2.如果你確切知道你有什麼樣的變量 *,你可以強制進行類型轉換。 3.您可以使用dynamic_cast來測試或實施您自己的RTTI系統 – jtlim