相关疑难解决方法(0)

const /非const重载决议的问题

我有一个看起来像这样的类:

class ClassA
{
  public:
    float Get(int num) const;
  protected:
    float& Get(int num);
}
Run Code Online (Sandbox Code Playgroud)

在课外,我调用了Get()函数.

float foo = classAInstance.Get(i);
Run Code Online (Sandbox Code Playgroud)

我希望这可以调用公共版本,但是Visual Studio会出错:

error C2248: 'ClassA::Get' : cannot access protected member declared in class 'ClassA'
Run Code Online (Sandbox Code Playgroud)

在注释掉受保护的重载并删除对它的所有引用时,代码将编译.

为什么编译器在可访问的成员可用时尝试使用不可访问的成员?是否有一种可以接受的方法来强制编译器选择正确的重载?在某处有成员函数的解决规则吗?

c++ overloading visual-studio-2010 overload-resolution

11
推荐指数
2
解决办法
2328
查看次数

您将如何使用标准引号解释指向基类和派生类成员的指针的这种区别?

演示

#include<iostream>
struct A { int i = 10; };
struct B : A { };

int main(){
    std::cout << "decltype(&B::i) == int A::* ? " << std::boolalpha
              << std::is_same<decltype(&B::i), int A::*>::value << '\n';    //#1
    A a;
    std::cout << a.*(&A::i) << '\n';

    std::cout << "decltype(&B::i) == int B::* ? "
              << std::is_same<decltype(&B::i), int B::*>::value << '\n';    //#2
    B b;
    std::cout << b.*(&B::i) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

代码打印

decltype(&B::i) == int A::* ? true
10
decltype(&B::i) == int B::* ? false …
Run Code Online (Sandbox Code Playgroud)

c++ pointer-to-member language-lawyer

8
推荐指数
1
解决办法
297
查看次数