Что такое ошибка C2039 и что она означает в этом случае?

Я не могу скомпилировать свой код из-за таких ошибок:

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 &) компилируется

Как я должен идентифицировать проблему как это? Мой предыдущий метод заключался в проверке первой ошибки и переходе к указанной строке, но в этот раз это не сработало.

Благодарю.

-1

Решение

Как указано в моем комментарии выше, ошибка отображается в окне вывода 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++ итератору, и так как вы передали объект, который не имеет ++ определено, ошибка испущена.

Таким образом, вопреки вашим утверждениям в посте, это не «бессмысленные ошибки компилятора». Ошибка имеет смысл.

2

Другие решения

Пожалуйста, прочтите описание ошибки на https://msdn.microsoft.com/en-us/library/fdwb3fd7.aspx

Похоже, ваш код использует шаблон. В экземпляре шаблона где-то, difference_type а также iterator_category ожидаются от вашего класса. Это означает, что либо от вашего объекта класса ожидается предоставление этих методов, либо вы передаете неправильный тип функции или объекту шаблона.

Проверьте все ссылки / использование вашего класса, особенно в шаблонных функциях. Это поможет вам найти ошибку.

0

По вопросам рекламы [email protected]