これは私のコンテナです:予想される一次式
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));
^~~~
この関数は、変数がすでに(名前で)存在するかどうかを調べなければならず、そうでなければマップに挿入しなければなりません。可変クラスは、さまざまなタイプの値のコンテナとして機能します。ノードは、特殊な変数に値をインスタンス化せずにマップを作成するために使用されます。
しようとしますコンパイラのエラーを修正するのは時間の無駄です。コンパイルエラーが修正された後、[オブジェクトのスライス](http://stackoverflow.com/questions/274626/what-is-object-slicing)のためにこのコードは動作しません。このマップは 'Node'sを含んでいます。 'Node'のサブクラスをマップに挿入しようとすると、そのサブクラスをドレインの下にフラッシュします。 C++はJavaではありません。 –
は、下線を引いた単語 'pair'を取り出します。 (しかしサムのコメントも読んでください) –
ありがとう、@SamVarshavchik、私は_スライス_を知らなかった。私はそれらの基本的な誤りを調べます。 –