由于这些错误,我无法编译我的代码:
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 这是我可以收集的代码。 作为参考,xutility的第371行读取
// 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&GT; team.cpp(13):参见函数模板实例化'void std :: fill(_FwdIt,_FwdIt,const _Ty&amp;)'正在编译
我该如何确定这样的问题?我之前的方法是检查第一个错误并转到所述行,但这次没有用。
感谢。
答案 0 :(得分:2)
正如我上面的评论所述,错误确实出现在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++
应用于迭代器,并且由于您传递了一个没有定义++
的对象,因此发出了错误。
与你在帖子中的说法相反,这些不是&#34;无意义的编译器错误&#34;。错误很有道理。
答案 1 :(得分:0)
请阅读https://msdn.microsoft.com/en-us/library/fdwb3fd7.aspx
上的错误说明您的代码看起来像是在使用模板。在模板实例化中,某个地方,您的班级需要difference_type
和iterator_category
。这意味着要么从您的类对象中提供这些方法,要么将错误的类型传递给模板函数或对象。
检查班级的所有参考/用法,尤其是模板功能。这将帮助您找到错误。