2016-06-11 5 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'sを含んでいます。 'Node'のサブクラスをマップに挿入しようとすると、そのサブクラスをドレインの下にフラッシュします。 C++はJavaではありません。 –

+0

は、下線を引いた単語 'pair'を取り出します。 (しかしサムのコメントも読んでください) –

+0

ありがとう、@SamVarshavchik、私は_スライス_を知らなかった。私はそれらの基本的な誤りを調べます。 –

答えて

3

はここにいくつかの問題があります:あなたは(新しい変数=変数< ....>)ポインタを挿入しようとしているとマップがポインタを取ることはありません

  1. 。代わりにstd::map<std::string, Node*> idents;が必要な場合があります。マップ内のポインタを使用することにより、あなたはまた、あなたがそうでなければ

  2. あなたのインサートが、(すなわち。ノードポインタを使用して、余分なpairを削除)idents.insert(std::pair<std::string, Node*>(name, variable));のようになります直面するオブジェクトのスライシングの問題を避ける

+0

はい、std :: pairオブジェクトを渡すのは正しい方法でした。私は 'make_pair'を使いました。また、 'Node *'を使用していますが、 'Variable'が' Node'として扱われるため 'Node'から継承されていなければ' Variable'の値にアクセスできないと思われます。とにかくありがとうございました。 –

+0

Variableの値にアクセスするには、いくつかの方法があります。1.基本クラスに仮想アクセサー関数を作成します。これには、変数サブクラスで特定のオーバーライドが必要です。 2.あなたが持っているVariable *の種類を正確に知っていれば、強制的に型キャストすることができます。 3. dynamic_castを使用して、RTTIの独自のシステムをテストしたり実装することができます – jtlim

関連する問題