调用基类constexpr方法时VS2015内部编译器错误

时间:2015-05-09 12:08:10

标签: c++11 c++14 constexpr vs-2015-preview

以下代码产生内部编译器错误(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();
}

它将被编译。 当这些方法具有相同的名称时出现问题,我需要调用基类方法。 (例如,当使用递归模板继承时)

任何解决方法?

2 个答案:

答案 0 :(得分:2)

实际问题是b被声明为constconstexpr暗示const对象)并且您正在尝试调用非const(因为C ++ 14,constexpr并不意味着const方法,请const}方法查看A::}方法...

根据标准,您无法通过简单地删除static_castconstexpr方式来解决问题。 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();
    }
};

当方法具有相同名称时也适用。