#c #visual-studio #c 11 #stdvector
#c #visual-studio #c 11 #stdvector
Вопрос:
Я новичок в C и пытаюсь создать небольшую игру для обхода подземелий. В настоящее время у меня есть несколько векторов, объявленных в моих заголовочных файлах, но они, похоже, выдают несколько ошибок. Я пытался найти эту проблему в StackOverflow, но ответы, похоже, не работают.
Вот один из моих заголовочных файлов: (Hero.h)
#pragma once
class Hero {
public:
Hero();
std::string name;
int experience;
int neededExperience;
int health;
int strength;
int level;
int speed;
std::vector<Item> items = std::vector<Item>();
void levelUp();
private:
};
Вот мой файл .cpp: (Hero.cpp )
#include "stdafx.h"
#include <vector>
#include "Hero.h"
#include "Item.h"
Hero::Hero() {
}
void Hero::levelUp()
{
};
Как я уже сказал, я новичок в C , поэтому в моем коде может быть намного больше ошибок, чем я знаю. Это всего лишь тест.
Ниже приведены ошибки, которые отображаются в списке ошибок Visual Studio 2015:
Error C2039 'vector': is not a member of 'std' CPPAssessment hero.h 13
Error C2143 syntax error: missing ';' before '<' CPPAssessment hero.h 13
Error C4430 missing type specifier - int assumed. Note: C does not support default-int CPPAssessment hero.h 13
Error C2238 unexpected token(s) preceding ';' hero.h 13
Ответ №1:
Включите <vector>
в свой заголовок Hero.h и рассмотрите возможность удаления его из вашего Hero.cpp файл, как указано в комментариях ниже.
Комментарии:
1. Не слишком уверен в этом ответе. В cpp-файле вектор включен перед hero. h так что все должно быть в порядке. То, что вы предлагаете, является хорошим советом, но, основываясь на информации OP, здесь это не будет проблемой. Сказав это, такого рода ошибки почти всегда вызваны отсутствующим заголовком, поэтому может случиться так, что информация OP неверна.
2. @paxdiablo Вы правы. Я собираюсь удалить этот ответ.
3. @paxdiablo Мы этого не знаем. Меня не удивило бы, если stdafx.h включает в себя hero.h, что приводит к его анализу перед vector.
4. stdafx.h не включает hero.h
5. Как правило, всегда делайте соответствующий файл заголовка первым файлом заголовка, который вы включаете в файл cpp (кроме предварительно скомпилированного заголовка, если вы их используете). Таким образом, вы убедитесь, что получаете подобные ошибки, когда файл заголовка не содержит всех необходимых заголовков.
Ответ №2:
std::vector<Item> items = std::vector<Item>();
объявляет полный тип.
Поэтому компилятору необходимо знать объявление std::vector
в этот момент (среди прочего, требуется установить оцениваемую константу во время компиляции sizeof Hero
). Решение заключается #include <vector>
в заголовке hero.h
, а не в исходном файле.
Ответ №3:
//.h
template<class _Ty>
class std::allocator;
template<class _Ty, class _Alloc = std::allocator<_Ty> >
class std::vector;
//this line in .cpp file. Put it before custom header files.
#include<vector>
Протестировано в vs 2017.
Таким образом, файл заголовка не будет включен в ваш пользовательский файл заголовка.
Но не уверен, почему способ сохранения для стека не работает.
Для получения дополнительной информации, https://github.com/YagaoDirac/snippet-set-for-cpp . И ссылка discord внутри.