C++ 代码在 VS2010 中工作但在 2013 中不工作

标签 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 上搜索了很多,但都没有成功。

最佳答案

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

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

然后,提供 friend 的声明abc 定义前的函数.我也摆脱了顶级 const s 在函数返回类型上。

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


另一种选择,我自己更喜欢,是重命名内联 friendvalue()以外的东西,然后称之为不合格。

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

关于C++ 代码在 VS2010 中工作但在 2013 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682746/

相关文章:

vb.net - VB中如何在线程中传递多个参数

c++ - MSVC : Reading a specific 64 or 32 bit register (e. g。 R10) 64 位代码?

c++ - Ncurses 输出函数只接受常量数据

c++ - 链接到通过 cmake 使用 boost 的库时删除 boost 依赖项

c++ - 对指针的常量引用

c++ - Unique_ptr 和前向声明

c++ - 为什么右值不能分配给 constexpr 引用变量

c++ - SFINAE 在类型和非类型模板参数的情况下工作方式不同

c++ - 无法设置 gdb 断点

c++ - C++ STL vector/列表容器的 Python 等效项