1

次のように、独自のクラス型 ( SY::Symbol )の静的ベクトルを宣言しようとしています。

SymbolsTable.h

namespace SYT
{
    class SymbolsTable
    {
        public:
            static std::vector<SY::Symbol> m_symbols;
                    void addToken(TK::Token);
    };
}

SymbolsTable.cppファイルの addToken メソッド内で使用したいと考えています。

SymbolsTable.cpp

#include "../../includes/px/SymbolsTable.h"
#include "../../includes/px/Token.h"

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols(std::initializer_list<SY::Symbol>);

SYT::SymbolsTable::SymbolsTable()
{

}

void SYT::SymbolsTable::addToken(TK::Token token)
{
    int index = getSymbolIndex(token); 

    if(index == -1)
    {
        SY::Symbol symb(token, "");
        SYT::SymbolsTable::m_symbols.push_back(symb);
        token.setIndex(indexOf(m_symbols, symb)); 
    }
    else
    {
        token.setIndex(index);
    }       
}

SymbolsTable.cpp内のクラス外で宣言して初期化しようとしましたが、エラーが発生しました。

エラー: クラス 'SYT::SymbolsTable' で宣言された 'std::vector SYT::SymbolsTable::m_symbols(std::initializer_list)' メンバー関数がありません

ご覧のとおり、初期化する必要があるため、 this を使用しようとしていますがinitializer_list、これが正しいかどうかはわかりません。

したがって、すべての前にベクトルを初期化する必要があることを知っています。

私の質問は:

  • どこで初期化するか;
  • 初期化する方法。
4

2 に答える 2

2
std::initializer_list<SY::Symbol>

これは型であるため、コンパイラはこれを指定されたスコープで宣言されていない関数定義として読み取っているため、エラーが発生します。

あなたは書ける

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols;

それを定義するだけ、または

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols{1,2,3,4};

初期化するには-1-4を有効なSY::Symbolオブジェクトに置き換えることに注意してください。

于 2013-02-15T17:52:38.160 に答える
1

あなたはただ書くことができます

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols;

cppファイル内。

これはデフォルトのコンストラクターを使用して、ベクトルを空のベクトルに初期化します。

ただし、非静的メンバー関数で静的データメンバーを更新するのは非常に間違っていると感じるため、静的メンバーは実際には必要ない可能性があります。むしろ、クラスの静的インスタンスが必要になる可能性があります。それでもおそらく最適ではない設計ですが、それでもおそらく改善されています。

于 2013-02-15T17:51:58.113 に答える