2016-02-11 3 views
1

Я пытаюсь определить в card.h некоторые векторы моделирования карточной игры. Я отделяю ряды карты в векторы number_ranks и non_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

Спасибо за вашу помощь, к сожалению, я получаю ошибку компилятора 'redefinition of 'int main()'' в файле 'main.cpp', потому что этот файл' #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, но он по-прежнему страдает от того же «переопределения» int main() в файле main.cpp', как у меня с его ответом. – DBedrenko

Смежные вопросы