2013-02-15 181 views
1

我想聲明我自己的類類型的靜態向量(SY ::符號)是這樣的:初始化向量

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裏面,但我GUET錯誤。

error: no 'std::vector SYT::SymbolsTable::m_symbols(std::initializer_list)' member function declared in class 'SYT::SymbolsTable'

正如你所看到的,我必須初始化它,所以我想利用這個initializer_list,我不知道如果我這樣做是正確的。

所以,我知道我必須在一切之前初始化矢量。

我的問題是:

  • 哪裏初始化;
  • 如何解除它。
+0

爲什麼它是靜態的? – Aleph 2013-02-15 17:52:49

回答

1

,你可以只寫

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols; 
在cpp文件

這使用默認構造函數,將矢量初始化爲空向量。然而,很可能你並不是真的想要一個靜態的成員,因爲它讓非靜態成員函數更新靜態數據成員感覺非常不對。而您可能需要該類的靜態實例。即使這可能是次優設計,但仍可能是一種改進。

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。