什么是错误C2039,在这种情况下它意味着什么?

时间:2015-04-01 02:33:26

标签: c++ visual-c++ visual-studio-2013 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&GT; team.cpp(13):参见函数模板实例化'void std :: fill(_FwdIt,_FwdIt,const _Ty&amp;)'正在编译

我该如何确定这样的问题?我之前的方法是检查第一个错误并转到所述行,但这次没有用。

感谢。

2 个答案:

答案 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_typeiterator_category。这意味着要么从您的类对象中提供这些方法,要么将错误的类型传递给模板函数或对象。

检查班级的所有参考/用法,尤其是模板功能。这将帮助您找到错误。