以下代码产生内部编译器错误(VS2015)
struct A
{
constexpr A(){}
constexpr int bar()
{
return 3;
}
};
struct B : A
{
constexpr B(){}
constexpr int foo()
{
return A::bar();
}
};
int main()
{
constexpr B b;
constexpr int dummy = b.foo();
return 1;
}
但是,如果我删除A :: qualifier:
constexpr int foo()
{
return bar();
}
它将被编译。 当这些方法具有相同的名称时出现问题,我需要调用基类方法。 (例如,当使用递归模板继承时)
任何解决方法?
答案 0 :(得分:2)
实际问题是b
被声明为const
(constexpr
暗示const
对象)并且您正在尝试调用非const
(因为C ++ 14,constexpr
并不意味着const
方法,请const
}方法查看A::
}方法...
根据标准,您无法通过简单地删除static_cast
或constexpr
方式来解决问题。 Visual Studio 2015的RTM前版本允许您这样做只是因为它对constexpr
的支持是初步的并且非常错误。 C ++ 11 constexpr
(但遗憾的是不是C ++ 14扩展struct A
{
constexpr A(){}
constexpr int bar() const
{
return 3;
}
};
struct B : A
{
constexpr B(){}
constexpr int foo() const
{
return A::bar();
}
};
int main()
{
constexpr B b;
constexpr int dummy = b.foo();
return 1;
}
)预计在VS 2015的RTM版本中得到完全支持(参见here)。
您的代码的正确版本是:
n > 1
答案 1 :(得分:1)
找到解决方案。 "这"应该转换为const A *:
struct B : A
{
constexpr B(){}
constexpr int foo()
{
return static_cast<const A*>(this)->bar();
}
};
当方法具有相同名称时也适用。