【发布时间】: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