我有一个问题。我的应用程序中的代码在VS2010中没有任何问题,当我今天将其迁移到VS2013时,它给我一个错误。
代码是 -
#include "stdafx.h"
#include <iostream>
class abc
{
int value;
public:
abc() { value = 3; }
const int value() const { return ::value(*this); }
friend const int value(const abc& var){ return var.value; }
};
int _tmain(int argc, _TCHAR* argv[])
{
abc obj;
std::cout<<obj.value();
return 0;
}
低于错误 -
Error 1 error C3861: 'value': identifier not found c:\consoleapplication1\consoleapplication1\consoleapplication1.cpp 13 1 ConsoleApplication1
2 IntelliSense: function "value" cannot be called with the given argument list
argument types are: (const ABC) c:\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp 13 35 ConsoleApplication1
我在StackOverFlow和Google上搜索了很多,没有运气。
答案 0 :(得分:2)
我很惊讶这在VS2010上编译。除非stdafx.h
包含value
的函数定义/声明,否则您调用的函数尚未在abc::value()
中定义。
此外,abc
包含数据成员和名为value
的成员函数,这是不允许的。要修复错误,请将数据成员value
重命名为其他内容(我已选择将其命名为value_
)。
然后,在friend
的定义之前提供abc
函数的声明。我还在函数返回类型上删除了顶级const
。
class abc;
int value(const abc& var);
class abc
{
int value_;
public:
abc() { value_ = 3; }
int value() const { return ::value(*this); }
friend int value(const abc& var){ return var.value_; }
};
我喜欢自己的另一个选项是将内联friend
重命名为value()
以外的其他选项,然后将其命名为不合格。
class abc
{
int value_;
public:
abc() { value_ = 3; }
int value() const { return value_fr(*this); }
friend int value_fr(const abc& var){ return var.value_; }
};