c++ - 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
值?val
Drvd
编辑:
请注意,结果与变体相同:friend class Base<Derived>;
而不是friend class Base;
解决方案
您可以使用一种方法:
#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;
}
推荐阅读
- python - Send response to all clients with FLASK
- python - 选择按包含的日期过滤字母数字列
- javascript - 通过 javascript 为 HTML 正文分配随机 rgb 背景颜色
- python-3.x - 如何使用pywinauto python按下windows键
- c# - ASP.NET Web 窗体用户注册电子邮件确认,IdentityHelper 不存在
- node.js - 我该怎么办,如果用户登录,他只能更改他的个人资料 nodejs/mongodb/mongoose/pug
- ios - 如何在 swift 中避免由于 AFNetworking 导致的内存泄漏
- docker - 为什么 docker-compose “环境”变量的处理方式与使用 docker run 通过 -e 标志定义的环境变量不同?
- c# - C# BinaryFormatter.Deserialize 失败并出现异常
- flutter - Flutter - 如何更改 CheckboxListTile 大小?