visualc++操作符有歧义等

visual c++ operator is ambiguous and other

本文关键字:歧义 操作符 visualc++      更新时间:2023-10-16

嗨,我有这个c++项目,它让我一些奇怪的错误,我不知道如何修复。所以,如果有人能给我一个解决方案,那就太好了。

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    #include <iomanip>
    using namespace std;
    using std::ostream;
    using std::endl;
    using std::cout; 
    class CStudentEmploy
    {
    private:
        string m_strName;
        string m_strFacNum;
        int m_iMinutes;
    public:
        CStudentEmploy(int m = 0) // Podrazbirasht se konstruktor 
        {
            m_strName = "N/A";
            m_strFacNum = "N/A";
            m_iMinutes = m;
        }
        CStudentEmploy(string n, string f, int m) // Ekspliciten konstruktor
        {
            m_strName = n;
            m_strFacNum = f;
            m_iMinutes = m;
        }
        CStudentEmploy(const CStudentEmploy &obj) // Copy konstruktor 
        {
            m_strName = obj.m_strName;
            m_strFacNum = obj.m_strFacNum;
            m_iMinutes = obj.m_iMinutes;
        }
        string GetName()
        {
            return m_strName;
        }
        string GetFacNum()
        {
            return m_strFacNum;
        }
        int GetMinutes()
        {
            return m_iMinutes;
        }
        void SetName (string n)
        {
            m_strName = n;
        }
        void SetFacNum (string f)
        {
            m_strFacNum = f;
        }
        void SetMinutes (int m)
        {
            m_iMinutes = m;
        }
        CStudentEmploy operator =(CStudentEmploy obj)
        {
            m_strName = obj.m_strName;
            m_strFacNum = obj.m_strFacNum;
            m_iMinutes = obj.m_iMinutes;
            return *this;
        }

        bool operator < (const CStudentEmploy& obj) const
        {
            return m_iMinutes < obj.m_iMinutes;
        }
        CStudentEmploy operator +(const CStudentEmploy &obj) const
        {
            return CStudentEmploy(m_iMinutes + obj.m_iMinutes);
        }
        friend ostream& operator <<(ostream& os, CStudentEmploy &obj);
        friend istream& operator>>(istream& is, CStudentEmploy &obj);
    };

    ostream& operator<<(ostream& os, CStudentEmploy &obj) {
        os<<setiosflags(ios::left)<<setw(8)<<obj.GetName()
             <<"|"<<setw(11)<<obj.GetFacNum()
             <<"|"<<setw(8)<<obj.GetMinutes()<<endl;
        return os;
    }

    istream& operator>>(istream& is, CStudentEmploy &obj) {
        string tmp_strName;
        string tmp_strFacNum;
        int tmp_iMinutes;
        is >> tmp_strName >> tmp_strFacNum >> tmp_iMinutes;
        obj.SetName(tmp_strName);
        obj.SetFacNum(tmp_strFacNum);
        obj.SetMinutes(tmp_iMinutes);
        return is;
    }

    class CAnalizeTime { 
    private:
        vector<CStudentEmploy>m_vData;
        void add(CStudentEmploy employ) {
            m_vData.push_back(employ);
        }
    public:
        CStudentEmploy getEmployAt(int i)
        {
            return m_vData[i];
        }
        long getEmployCount()
        {
            return m_vData.size();
        }
        CAnalizeTime()
        {
            ifstream fs;
            fs.open("test.txt");
            if(!fs.is_open()) cout<<"error opening file!n";
            CStudentEmploy employ;
            while(!fs.eof())
            {
                fs>>employ;
                add(employ);
            }
        }
        CAnalizeTime(const string& strFileName)
        {
            ifstream fs;
            fs.open(strFileName.c_str());
            if(!fs.is_open()) cout<<"error opening file!n";
            CStudentEmploy employ;
            while(!fs.eof())
            {
                fs>>employ;
                add(employ);
            }
        }
        void Sort()
        {
            sort(m_vData.begin(),m_vData.end());
        }
        vector<int> calcNums(int iR1,int iR2,int iR3,
                                 int iR4,int iR5,int iR6)
        {
            vector<int> resultVector;
            for (int i=0;i<5;i++)
            {
                resultVector.push_back(0);
            }
            for (i=0;i<m_vData.size();i++)
            {
                if(m_vData[i].GetMinutes()>=iR1
                             &&m_vData[i].GetMinutes()<iR2) 
                                    resultVector[0]++;//[iR1-iR2)
                if(m_vData[i].GetMinutes()>=iR2
                             &&m_vData[i].GetMinutes()<iR3) 
                                   resultVector[1]++;//[iR2-iR3)
                if(m_vData[i].GetMinutes()>=iR3
                              &&m_vData[i].GetMinutes()<iR4) 
                                   resultVector[2]++;//[iR3-iR4)
                if(m_vData[i].GetMinutes()>=iR4
                            &&m_vData[i].GetMinutes()<iR5) 
                                  resultVector[3]++;//[iR4-iR5)
                if(m_vData[i].GetMinutes()>=iR5
                             &&m_vData[i].GetMinutes()<iR6) 
                                  resultVector[4]++;//[iR5-iR6)
            }
            return resultVector;
        }
        double calcMean() 
        {
            double sum=0;
            for (int i=0;i<m_vData.size();i++)
            {
                sum+=m_vData[i].GetMinutes();
            }
            return sum/m_vData.size();
        }
    };
    ostream& operator<<(ostream& os, CAnalizeTime &obj) 
    {
        for (int i=0;i<obj.getEmployCount();i++)
        {
            cout<<obj.getEmployAt(i);
        }
        return os;
    }
    void main() 
    {
        CAnalizeTime myTimeAnalyzer;
        //myTimeAnalyzer.Sort();
        cout<<setiosflags(ios::left)<<setw(8)
                <<"Name"<<setw(12)
                <<"|FacNum"<<setw(8)<<"|Minutes"<<endl;
        cout<<"----------------------------"<<endl;
        cout<<myTimeAnalyzer;
        cout<<"CalcMean result:"<<myTimeAnalyzer.calcMean()<<endl;
        vector<int>myCalcNums = myTimeAnalyzer.calcNums(1,50,100,200,400,800);
        cout<<"CalcNums result:"
                <<myCalcNums[0]<<","
                <<myCalcNums[1]<<","
                <<myCalcNums[2]<<","
                <<myCalcNums[3]<<","
                <<myCalcNums[4]<<endl;
        system("pause");
        return;
    }

当我在VC6 error C2593: 'operator >>' is ambiguous上运行时,我得到了这个错误,当我在2010上运行时,我得到了这个错误

1>------ Build started: Project: test_project, Configuration: Debug Win32 ------
1>Build started 5/14/2013 10:02:29 PM.
1>InitializeBuildStatus:
1>  Touching "Debugtest_project.unsuccessfulbuild".
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>LINK : error LNK2001: unresolved external symbol _mainCRTStartup
1>C:UsersUserDesktoptest_projecttest_projectDebugtest_project.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.80
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我的问题是什么导致这些错误

我在这几行有错误:

CAnalizeTime()
        {
            ifstream fs;
            fs.open("test.txt");
            if(!fs.is_open()) cout<<"error opening file!n";
            CStudentEmploy employ;
            while(!fs.eof())
            {
                fs>>employ;
                add(employ);
            }
        }
        CAnalizeTime(const string& strFileName)
        {
            ifstream fs;
            fs.open(strFileName.c_str());
            if(!fs.is_open()) cout<<"error opening file!n";
            CStudentEmploy employ;
            while(!fs.eof())
            {
                fs>>employ;
                add(employ);
            }
        }

错误信息是这样的:

--------------------Configuration: project_testing - Win32 Debug--------------------
Compiling...
project_testing.cpp
D:My Documentsproject_testingproject_testingproject_testing.cpp(143) : error C2593: 'operator >>' is ambiguous
D:My Documentsproject_testingproject_testingproject_testing.cpp(156) : error C2593: 'operator >>' is ambiguous
Error executing cl.exe.
project_testing.obj - 2 error(s), 0 warning(s)

问题是obj.getEmployAt(i);返回一个右值临时CStudentEmploy对象,您将其发送给operator<<重载。但是操作符重载要求是一个引用,不能绑定到右值。

必须使用const引用来代替

ostream& operator<<(ostream& os, const CStudentEmploy &obj) {
                                 ^^^^^

并将其中使用的函数固定为const,例如

string GetName() const { return m_strName; }
                 ^^^^^


或者你可以修复你的getEmployAt函数返回一个引用

CStudentEmploy& getEmployAt(int i) { return m_vData[i]; }
             ^^^


正如评论中提到的:我不知道你使用的是什么编译器,但void不是main的有效返回值。使用int mainreturn 0;