Я не могу скомпилировать свой код из-за таких ошибок:
Error C2039: 'difference_type' : is not a member of 'Player' c:\program files (x86)\
microsoft visual studio 12.0\vc\include\xutility 373 1 Football Simulator"Error C2039: 'iterator_category' : is not a member of 'Player' c:\program files (x86)\
microsoft visual studio 12.0\vc\include\xutility 371 1 Football Simulator"
И так далее.
Эти сообщения не имеют ничего общего с тем, как исправить код или где у компилятора возникли проблемы, и он оставил мне код, который я сейчас не могу скомпилировать.
Есть одна конкретная проблема с моим кодом, и я получаю кучу бесполезных ошибок компилятора, и среди них полезная ошибка, которая говорит мне, где настоящая ошибка
https://www.dropbox.com/s/jr2lmqwvfurpnok/Football%20Simulator.rar?dl=0
Это то, что я мог собрать из своего кода.
Для справки, строки 371 xutility читайте
// TEMPLATE CLASS iterator_traits
template<class _Iter>
struct iterator_traits
{ // get traits from iterator _Iter
typedef typename _Iter::iterator_category iterator_category;
typedef typename _Iter::value_type value_type;
typedef typename _Iter::difference_type difference_type;
typedef difference_type distance_type; // retained
typedef typename _Iter::pointer pointer;
typedef typename _Iter::reference reference;
};
Это мой stdafx.h
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <algorithm>
#include <cassert>
#include <string>
#include <time.h>
И это мой Player.h Что отлично.
#pragma once
#include "PlayerAttributes.h"enum Position{
GK,
FB,
CB,
DM,
CM,
FW,
MAX_POSITIONS
};
class Player
{
PlayerAttributes Attributes;
std::string m_sName;
int m_nAge;
Position m_ePosition;
std::string e_sTeamName;
public:
Player();
Player(int nDesiredAttributeValues);
//
Player(std::string sName, int nAge, Position ePosition);
Player(std::string sName, int nAge, Position ePosition, int nDesiredAttributeValues);
~Player();
friend std::ostream& operator<< (std::ostream &out, Player &cPlayer);
};
РЕДАКТИРОВАТЬ:
И, как указано ниже, фактическая ошибка лежит в файле team.cpp
Team::Team(int nNumberOfPlayers, int nAttributeValue){
acPlayer = new Player[nNumberOfPlayers];
std::fill(acPlayer[0], acPlayer[nNumberOfPlayers-1], nAttributeValue); // error
nTeamSize = nNumberOfPlayers;
}
Ничего полезного не появилось в списке ошибок и в выводе, 5-е сообщение гласило:
1> team.cpp (13): см. Ссылку на создание шаблона функции ‘void std :: fill (_FwdIt, _FwdIt, const _Ty &) компилируется
Как я должен идентифицировать проблему как это? Мой предыдущий метод заключался в проверке первой ошибки и переходе к указанной строке, но в этот раз это не сработало.
Благодарю.
Как указано в моем комментарии выше, ошибка отображается в окне вывода Visual Studio, вы просто ее не видели (по какой-то причине).
Ошибка утверждает это:
1> team.cpp(13) : see reference to function template instantiation 'void std::fill<Player,int>(_FwdIt,_FwdIt,const _Ty &)' being compiled
Эта ошибка указывает на это в Team.cpp
файл:
//Test Slow version
Team::Team(int nNumberOfPlayers, int nAttributeValue){
acPlayer = new Player[nNumberOfPlayers];
std::fill(acPlayer[0], acPlayer[nNumberOfPlayers-1], nAttributeValue); // error
nTeamSize = nNumberOfPlayers;
}
Теперь, когда все это видят, мы можем рассказать вам, в чем проблема. std::fill
Функция требует итераторов для первых двух параметров, но вы предоставили полностью разнесенные объекты, а не итераторы.
Исправление должно сделать это:
std::fill(acPlayer, acPlayer + nNumberOfPlayers, nAttributeValue);
Указатель имеет те же черты, что и итератор, который удовлетворяет условиям, которые std::fill
требует. Первоначальная проблема заключалась в том, что std::fill
алгоритм применял operator++
итератору, и так как вы передали объект, который не имеет ++
определено, ошибка испущена.
Таким образом, вопреки вашим утверждениям в посте, это не «бессмысленные ошибки компилятора». Ошибка имеет смысл.
Пожалуйста, прочтите описание ошибки на https://msdn.microsoft.com/en-us/library/fdwb3fd7.aspx
Похоже, ваш код использует шаблон. В экземпляре шаблона где-то, difference_type
а также iterator_category
ожидаются от вашего класса. Это означает, что либо от вашего объекта класса ожидается предоставление этих методов, либо вы передаете неправильный тип функции или объекту шаблона.
Проверьте все ссылки / использование вашего класса, особенно в шаблонных функциях. Это поможет вам найти ошибку.