c++ - 使用 C++17 扩展使用声明的问题
问题描述
我试图通过 C++17 中的包扩展来了解一些新的可能性,但遇到了一个我不明白的问题。我创建了一个继承自一组基类模板的派生类。
然后我尝试将所有基类构造函数导入并添加一个访问基类常量的方法。但是,当我尝试编译时出现以下错误。
error: expected primary-expression before '...' token 23 | return mValue == Base<M, tuple_element_t<Is, Tuple>...>::value
如果我注释基类构造函数的导入或注释方法,编译工作会发现。有什么东西阻止我两者兼得吗?
这是一个最小的例子:
#include <tuple>
#include <utility>
using namespace std;
template <size_t N, typename... Types>
struct Base
{
static constexpr size_t value = N;
};
template <typename Tuple, typename Indices>
struct Derived;
template <typename Tuple, size_t... Is>
struct Derived<Tuple, index_sequence<Is...>> : public Base<Is, std::tuple_element_t<Is,Tuple>... >...
{
// Works if following line is commented
using Base<Is, tuple_element_t<Is, Tuple>...>::Base...;
template<size_t M> bool check() const
{
return mValue == Base<M, tuple_element_t<Is, Tuple>...>::value;
}
size_t mValue;
};
template <typename... Types>
struct Test : public Derived<tuple<Types...>, make_index_sequence<sizeof...(Types)>>
{};
int main ()
{
using MyType = Test<int, float, float>;
MyType test;
return 0;
}
解决方案
这是gcc 错误 79094。该程序格式良好,clang和icc接受它。
msvc 接受 gcc 错误报告中的简单版本,但拒绝这个稍微复杂的版本(与您的示例更相似):
template <typename>
class U { };
template <class... Args>
struct X : U<Args>...
{
using U<Args>::U...;
};
推荐阅读
- r - R ggplot 与百分比
- docker - 带有 Traefik 的 Docker 群堆栈中的 Portainer 拒绝连接
- laravel - 自定义加密特征破坏了碳功能并给出错误:有效负载无效
- flutter - 将日期时间列表转换为字符串
- node.js - O(N) 简单的 Diffing 算法实现——对吗?
- python - 如何从命名元组中检索特定字段,作为字典键中的值
- python - 为什么正确答案同时打印 score = 3 和 score = 1?
- javascript - 检查 postgresql 数据库中是否存在值?
- android - Android 无法序列化 Kotlin lambda
- python - Python发布请求,发布问题