当我尝试在私有方法函数上使用decltype()
时,出现错误,指出私有方法error: 'm1' has not been declared in this scope
#include <stdint.h>
class C
{
public:
C()=default;
~C()=default;
auto masterMethod(int opMode) ->decltype(m1())
{
switch(opMode)
{
case 1:
return m1(); break;
case 2:
return m2(); break;
default:
return m1(); break;
}
}
private:
int m1() {return 1;}
int m2() {return 2;}
};
现在我的问题是,为什么编译器不在类的私有部分中查找,因为删除尾随返回类型或将私有部分放在masterMethod
之上可以解决此问题(decltype(auto)
(在允许使用C ++ 14的情况下)其自动返回类型推导也将是正确的。
此外,当decltype(m1())
和m1()
具有相同的返回类型时,删除m2()
时是否会发生不良行为,这对我也一样?
答案 0 :(得分:8)
这与private
和尾随返回类型均无关。
这里的问题是,虽然一个类中的所有声明的名称都在其成员函数的 bodies 的范围内,但尾随类型却不是函数主体的一部分-它是原型的一部分。
以下是这个问题的小得多的示例:
struct A
{
T f();
using T = int;
};
而g ++说
error: 'T' does not name a type
但这很好:
struct A
{
using T = int;
T f();
};
唯一的解决方案是更改声明的顺序。