首页 > 解决方案 > c ++静态多态性(CRTP)在评估`static constexpr`时导致类型不完整

问题描述

我需要访问static constexpr一个我放在一起的解决方案,它适用于 gcc(现场示例),但不适用于 vc++(现场示例)。

代码如下:

template<class Drvd>
class Base
{
public:
    static constexpr bool val = Drvd::val;
};

class Derived : public Base<Derived>
{
    friend class Base;
private:
    static constexpr bool val = true;
};

int main()
{
    std::cout << Derived::Base::val << std::endl;
}

所以这是 vc++ 的一个错误,但是任何人都知道如何以vc++ 不会抱怨的不同方式将inval定义为 in的Base值?valDrvd

编辑: 请注意,结果与变体相同:friend class Base<Derived>;而不是friend class Base;

标签: c++visual-c++metaprogrammingcrtpstatic-polymorphism

解决方案


您可以使用一种方法:

#include <iostream>

template<class Drvd>
class Base
{
public:
    static constexpr bool val() { return Drvd::val;  }
};

class Derived : public Base<Derived>
{
    friend class Base<Derived>;
private:
    static constexpr bool val = true;
};

int main()
{
    std::cout << Derived::Base::val() << std::endl;
}

现场示例:https ://rextester.com/IHR24393


推荐阅读