2016-06-11 36 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