visualc++操作符有歧义等
visual c++ operator is ambiguous and other
嗨,我有这个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 main
和return 0;
相关文章:
- 构造对象的歧义
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 数组初始值设定项的构造函数歧义
- 消除好友和成员二进制运算符的歧义
- 用' . '代替' :: '会在C++中造成歧义吗?
- 为什么下面带有非常量转换函数的代码没有歧义?
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- C++SFINAE enable_if_t成员函数,如何消除歧义?
- 多重继承相同的方法名,没有歧义
- 如何在模板化转换运算符中消除此构造的歧义?
- 当存在覆盖歧义函数时,代码如何运行?
- 如何区分宏函数和函数函数而没有任何歧义?
- 当目标类有多个构造函数时,消除强制转换操作符的歧义
- c++操作符string和char*导致歧义错误
- 多个操作符重载会导致歧义调用
- 操作符[](const char *)歧义
- visualc++操作符有歧义等
- 强制转换操作符总是有歧义的
- 歧义赋值操作符