2016-02-19 104 views
-2

我有一個類,它有一個擁有n個集合的向量成員。我想通過公共成員函數訪問此成員,將項目插入到集合中並查找集合中的項目。但是編譯時出錯:引用非靜態成員函數必須調用C++是我引用一個函數或數據成員? (必須調用非靜態成員函數引用)

但我真的很困惑,因爲我不認爲我引用了一個成員函數,我想我試圖訪問一個向量成員。

我在做什麼錯?

#include <vector> 
#include <set> 
#include <iostream> 

class Foo { 

public: 
    std::vector <std::set<int>> entities(int x); 
    int find(int x, int y); 
    void insert(int x, int y); 
    Foo(int x); 
}; 

Foo::Foo(int x) { 
    std::vector <std::set<int>> entities(x); 
}; 

void Foo::insert(int x, int y) { 
    entities[x].insert(y); // << This causes error 
}; 

int Foo::find(int x, int y) { 
    std::set<int>::iterator iter = entities[x].find(y); // << This causes error 
    int found; 
    if (iter != entities[x].end()) { // << This causes error 
     found = *iter; 
    } 
    return found; 
}; 

int main() { 
    std::cout << "Hello World!" << std::endl; 
    return 0; 
} 
+0

ö你的錯誤是什麼? –

+3

最好提供一個MCVE(請參閱幫助)。使我們更容易查明問題。 –

+0

「entries」和「entities」是同一個東西還是兩個不同的東西? –

回答

3

在類定義中,std::vector <std::set<int>> entities(int x);聲明瞭一個成員函數,該函數採用int參數並返回std::vector <std::set<int>>

在構造函數中,std::vector <std::set<int>> entities(x);聲明瞭一個局部變量。

成員函數是「實體」在其他成員函數中引用的內容。

如果你想有一個成員變量所謂的「實體」,寫

std::vector <std::set<int>> entities; 

類定義,並在初始化器列表初始化它:

Foo::Foo() : entities(x) 
{ 
} 

,或者,如果大小ISN 「T在該點已知的,調整它在構造體:

Foo::Foo() 
{ 
    entities.resize(x); 
} 
1

您不能在類定義中使用括號來初始化數據成員。以下行將被視爲函數聲明。

std::vector <std::set<int>> entities(int x); 

相反,您可以使用構造函數初始化數據成員。

相關問題