考虑以下代码:
#include<iostream>
using namespace std;
class sample
{
int a;
int b;
public:
void setValue()
{
a=25;
b=40;
}
friend float mean(sample s)
{
return float(s.a+s.b)/2.0;
}
}
int main()
{
sample x;
x.setValue();
cout<< "mean value:"<< mean(x)<<endl;
cin.ignore();
getchar();
return (0);
}
Run Code Online (Sandbox Code Playgroud)
我希望在尝试编译和运行它时输出:
平均值:32.5
但是,我得到了这些编译器错误:
1> frndF.cpp
1>c:\users\mg\documents\visual studio 2010\projects\frndf\frndf\frndf.cpp(18): error C2628: 'sample' followed by 'int' is illegal (did you forget a ';'?)
1>c:\users\mg\documents\visual studio 2010\projects\frndf\frndf\frndf.cpp(19): error C3874: return type of 'main' should be 'int' instead of 'sample'
1>c:\users\mg\documents\visual studio 2010\projects\frndf\frndf\frndf.cpp(27): error C2664: 'sample::sample(const sample &)' : cannot convert parameter 1 from 'int' to 'const sample &'
1> Reason: cannot convert from 'int' to 'const sample'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:\users\mg\documents\visual studio 2010\projects\frndf\frndf\frndf.cpp(15): warning C4244: 'return' : conversion from 'double' to 'float', possible loss of data
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
您忘记了类定义的右括号后的分号:
class sample
{
//code omitted for brevity
}; <------------------- you forgot this
Run Code Online (Sandbox Code Playgroud)
虽然,这与错误或预期输出无关,但您应该将参数传递给mean()按const引用:
friend float mean(sample const & s)
{ //^^^^^^^ const reference
return float(s.a+s.b)/2.0;
}
Run Code Online (Sandbox Code Playgroud)
这避免了不必要的参数副本。