【问题标题】:C++ code working in VS2010 but not in 2013C++ 代码在 VS2010 中工作,但在 2013 年不工作
【发布时间】:2014-07-10 17:26:13
【问题描述】:

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

【问题讨论】:

  • 不确定 V2010 如何编译该代码,但您将 value 作为成员数据和成员函数。这是不合法的。
  • 你想做什么?为什么要写这么多代码?
  • 不能与 Microsoft Visual Studio 2010 版本 10.0.30319.1 RTMRel 一起编译:
  • 请不要在一周后以使给定答案无效的方式编辑您的问题。相反,请尝试隔离您正在努力解决的问题并将其作为新问题发布。

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


【解决方案1】:

我很惊讶这是在 VS2010 上编译的。除非stdafx.h 包含value 的函数定义/声明,否则您调用的函数尚未在abc::value() 中定义。

另外,abc 包含一个数据成员和一个名为 value 的成员函数,这是不允许的。要修复错误,请将数据成员 value 重命名为其他名称(我选择将其命名为 value_)。

然后,在abc 的定义之前提供friend 函数的声明。我还去掉了函数返回类型上的顶级consts。

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

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多