2016-02-11 80 views
1

我試圖在card.h中定義一些向量來建模紙牌遊戲。我單獨的卡行列入載體number_ranksnon_number_ranks,並要聲明一個const vector<Rank> ranks一種結合了前面提到的載體:爲什麼編譯器認爲我沒有爲矢量var命名類型?

// "card.h" file contents (top level). 
#include <vector> 
using namespace std; 

enum class Rank {one = 1, two, three, four, five, six, seven, eight, 
       nine, ten, jack, queen, king, ace}; 
const vector<Rank> number_ranks { 
    Rank::one, Rank::two, Rank::three, Rank::four, Rank::five, 
    Rank::six, Rank::seven, Rank::eight, Rank::nine, Rank::ten}; 
const vector<Rank> non_number_ranks { 
    Rank::jack, Rank::queen, Rank::king, Rank::ace}; 

vector<Rank> _tmp (number_ranks); 
// ERROR ON THE LINE BELOW. 
_tmp.insert(_tmp.end(), non_number_ranks.begin(), non_number_ranks.end()); 
const vector<Rank> ranks (_tmp); 

但是我得到的註釋行此編譯器錯誤:

card.h|16|error: ‘_tmp’ does not name a type 

不過我只是在錯誤的行前明確界定上線的_tmp類型:

vector<Rank> _tmp (number_ranks); 

爲什麼編譯器認爲我沒有命名該類型?

+2

您不能調用從頂級的方法。表達式不允許在頂層(* namespace-scope *),只有聲明。 –

+1

我猜這個代碼不在任何函數中,它的全局函數,所以編譯器不明白他需要調用一個函數。 –

+1

請注意,您應該[避免在標識符上使用前導下劃線](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)。 – user694733

回答

2

行政語句應該放在一個函數內,如:

vector<Rank> _tmp(number_ranks); 

int main() { 
    _tmp.insert(_tmp.end(), non_number_ranks.begin(), non_number_ranks.end()); 
} 

或者你可以爲它定義一個特殊功能:

vector<Rank> get_ranks() { 
    vector<Rank> tmp(number_ranks); 
    tmp.insert(tmp.end(), non_number_ranks.begin(), non_number_ranks.end()); 
    return tmp; 
} 

const vector<Rank> ranks = get_ranks(); 
+0

感謝您的幫助,不幸的是我在'main.cpp'文件中得到了'int main()'重定義的編譯器錯誤,因爲這個文件包含'#include「card.h」'。還有另外一種方法可以解決這個問題嗎? – DBedrenko

+0

@NewWorld你可以在'card.h'中定義另一個函數來完成它。 – songyuanyao

+0

如果我在第二個代碼示例中使用代碼,編譯器會拋出'get_ranks()'的多重定義。我不確定爲什麼發生這種情況(該文件包含頭文件守護程序),但是如果我將'get_ranks()'實現移到'card.cpp'中,而只是在card.h中聲明該函數,那麼它編譯成功。 – DBedrenko

1

您不能從調用一個函數頂級

任何函數調用都應該在一個函數內進行。 以下工作(實況:https://ideone.com/MPFhhK

#include <stdio.h> 
#include<iostream> 
#include <vector> 
using namespace std; 

enum class Rank {one = 1, two, three, four, five, six, seven, eight, 
       nine, ten, jack, queen, king, ace}; 
const vector<Rank> number_ranks { 
    Rank::one, Rank::two, Rank::three, Rank::four, Rank::five, 
    Rank::six, Rank::seven, Rank::eight, Rank::nine, Rank::ten}; 
const vector<Rank> non_number_ranks { 
    Rank::jack, Rank::queen, Rank::king, Rank::ace}; 

vector<Rank> _tmp (number_ranks); 

const vector<Rank> ranks (_tmp);  // **ERROR ON THIS LINE** 


void initialize(){ 
    _tmp.insert(_tmp.end(), 
    non_number_ranks.begin(), non_number_ranks.end()); 
} 


int main(void) { 
    initialize(); 
    for(auto i=0;i<_tmp.size();i++) 
     std::cout<<(unsigned int)_tmp[i]<<std::endl; 
    return 0; 
} 
+0

感謝您的想法。在開始時,這是對@ songyuanyao的答案的一個改進,但它仍然受到像main.cpp一樣的重新定義'int main()'問題的困擾,就像我的答案一樣。 – DBedrenko

相關問題