1

我正在尝试声明我自己的类类型(SY::Symbol)的静态向量,如下所示:

符号表.h

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

我想在 SymbolsTable.cpp 文件的方法 addToken 中使用

符号表.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};

SY::Symbol初始化它 - 注意用有效对象替换 1-4 。

于 2013-02-15T17:52:38.160 回答
1

你可以写

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

在 cpp 文件中。

这使用默认构造函数,将向量初始化为空向量。

但是,很可能您并不真的想要一个静态成员,因为让非静态成员函数更新静态数据成员感觉非常错误。相反,您可能想要该类的静态实例。甚至这可能是一个次优设计,但仍然可能是一种改进。

于 2013-02-15T17:51:58.113 回答