【问题标题】:Expected primary expression before 'pair''pair' 之前的预期主要表达式
【发布时间】:2016-06-11 23:32:48
【问题描述】:

这是我的容器:

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 ) );                                                        
                                                                   ^~~~

该函数必须查看变​​量是否已经存在(按名称),如果不存在,则将其插入地图。变量类用作不同类型值的容器。节点用于创建映射,而不将值实例化为某些专用变量。

【问题讨论】:

  • 试图修复编译器错误是浪费时间。在编译错误得到修复后,由于object slicing,这段代码无论如何都不会工作。该地图包含Nodes。尝试将Node 的任何子类插入到地图中都会将该子类冲入下水道。 C++ 不是 Java。
  • 去掉下划线的单词pair。 (但也请阅读 Sam 的评论)
  • 谢谢@SamVarshavchik,我不知道对象切片。我会调查这些基本错误。

标签: c++ templates g++ stdmap std-pair


【解决方案1】:

这里有几个问题:

  1. 您正在尝试插入一个指针 (variable = new Variable<....>) 并且映射不使用指针。您可能想要std::map&lt;std::string, Node*&gt; idents;。通过在地图中使用指针,您还可以避免原本会面临的对象切片问题

  2. 您的插入应该类似于idents.insert( std::pair&lt;std::string, Node*&gt;(name, variable ) );(即使用节点指针并删除额外的pair

【讨论】:

  • 是的,传递 std::pair 对象是正确的方法,我使用了make_pair。我现在也在使用Node*,但我怀疑Variable 的值如果不是从Node 继承的,将无法访问,因为Variable 将被视为Node。无论如何,谢谢。
  • 有几种方法可以访问变量的值: 1. 在基类中创建虚拟访问器函数。这将需要在 Variable 子类中进行特定覆盖。 2. 如果你确切地知道你有什么样的 Variable*,你可以强制进行类型转换。 3.你可以使用dynamic_cast来测试,或者实现你自己的RTTI系统
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2018-11-27
  • 2020-01-16
相关资源
最近更新 更多