gpt4 book ai didi

c++ - 使用声明的 Variadic 基类无法在 MSVC 中编译

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:52 25 4
gpt4 key购买 nike

我正在尝试实现可变访问者类。

template<typename T>
class VisitorBaseFor {
protected:
virtual ~VisitorBaseFor() = default;

public:
virtual void visit(T &t) = 0;
};

template<typename... Ts>
class VisitorBase : public VisitorBaseFor<Ts>... {
public:
using VisitorBaseFor<Ts>::visit...;
};

我从that overload trick知道可变参数 using 声明应该是可能的,但是 MSVC 没有编译我的代码说我需要扩展 Ts 而 GCC 和 Clang 编译我的代码没有错误,参见 here .

我错过了什么?这是一个 MSVC 错误还是只是(还)不受支持?如果是,是否有解决此问题的方法?

除此之外,我曾尝试删除 using 声明,但由于某种原因,对 visit 的调用变得模棱两可,即使 Ts 中的所有类都不能相互转换。 MSVC 对此进行了正确诊断,但为什么它们甚至用于重载解析?

更新:这是一个已知错误,至少从 2018 年 9 月 3 日开始。参见 herehere .

最佳答案

代码确实是正确的,所以是 msvc 的 bug。

解决方法是手动执行递归:

template<typename T>
class VisitorBaseImpl {
protected:
virtual ~VisitorBaseImpl() = default;

public:
virtual void visit(T &t) = 0;
};

template<typename... Ts> class VisitorBase;

template<typename T>
class VisitorBase<T> : public VisitorBaseImpl<T>
{
};

template<typename T, typename... Ts>
class VisitorBase<T, Ts...> : public VisitorBase<T>, public VisitorBase<Ts...>
{
public:
using VisitorBase<T>::visit;
using VisitorBase<Ts...>::visit;
};

Demo

关于c++ - 使用声明的 Variadic 基类无法在 MSVC 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57554389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com