什么是错误 C2039?在这种情况下它意味着什么?
What is Error C2039 and what does it mean in this case?
由于以下错误,我无法编译我的代码:
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> team.cpp(13) : 请参阅函数模板实例化参考 'void std::fill(_FwdIt,_FwdIt,const _Ty &)' 正在编译
我该如何识别这样的问题?我以前的方法是检查第一个错误并转到指定的行,但是这次没有用。
谢谢。
请阅读 https://msdn.microsoft.com/en-us/library/fdwb3fd7.aspx
处的错误描述
看起来您的代码正在使用模板。在模板实例化中,在某处,difference_type
和 iterator_category
应该来自您的 class。这意味着您的 class 对象需要提供这些方法,或者您将错误的类型传递给模板函数或对象。
检查您 class 的所有 reference/usage,尤其是在模板函数中。这将帮助您找到错误。
正如我上面的评论所述,错误确实出现在 Visual Studio 输出 window 中,您只是没有看到它(出于某种原因)。
错误指出:
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++
应用于迭代器,并且由于您传递了一个未定义 ++
的对象,因此发出了错误。
所以与您在 post 中的声明相反,这些不是 "nonsense compiler errors"。这个错误很有意义。
由于以下错误,我无法编译我的代码:
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> team.cpp(13) : 请参阅函数模板实例化参考 'void std::fill(_FwdIt,_FwdIt,const _Ty &)' 正在编译
我该如何识别这样的问题?我以前的方法是检查第一个错误并转到指定的行,但是这次没有用。
谢谢。
请阅读 https://msdn.microsoft.com/en-us/library/fdwb3fd7.aspx
处的错误描述看起来您的代码正在使用模板。在模板实例化中,在某处,difference_type
和 iterator_category
应该来自您的 class。这意味着您的 class 对象需要提供这些方法,或者您将错误的类型传递给模板函数或对象。
检查您 class 的所有 reference/usage,尤其是在模板函数中。这将帮助您找到错误。
正如我上面的评论所述,错误确实出现在 Visual Studio 输出 window 中,您只是没有看到它(出于某种原因)。
错误指出:
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++
应用于迭代器,并且由于您传递了一个未定义 ++
的对象,因此发出了错误。
所以与您在 post 中的声明相反,这些不是 "nonsense compiler errors"。这个错误很有意义。