"对"之前的预期主要表达式

Expected primary expression before 'pair'

本文关键字:表达式      更新时间:2023-10-16

这是我的容器:

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

该函数必须查看变量是否已存在(按名称),如果不存在,则将其插入到映射中。变量类充当不同类型值的容器。Node 用于创建映射,而无需将值实例化为某些专用变量。

这里有几个问题:

  1. 您正在尝试插入指针(变量 = new Variable<....>),但地图不接受指针。您可能需要std::map<std::string, Node*> idents;。通过在映射中使用指针,您还可以避免否则会面临的对象切片问题

  2. 您的插入内容应看起来像idents.insert( std::pair<std::string, Node*>(name, variable ) );(即使用节点指针并删除多余的pair