C ++代码在VS2010中工作但在2013年没有

时间:2014-07-10 17:26:14

标签: c++ visual-studio c++11 visual-studio-2013

我有一个问题。我的应用程序中的代码在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上搜索了很多,没有运气。

1 个答案:

答案 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_; }
};

Live demo


我喜欢自己的另一个选项是将内联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_; }
};

Live demo