在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败

Calling base-class members by expanding each parameter pack fails in Visual Studio 2017

本文关键字:参数 呼叫 失败 成员 基类 扩展 2017 Studio Visual      更新时间:2023-10-16

考虑以下代码:

class A
{
public:
    void GoImpl() { cout << "A"; }
};
class B
{
public:
    void GoImpl() { cout << "B"; }
};
template <class... Mixins>
class Foo : public Mixins...
{
public:
    void Go()
    {
        int temp[] = { 0, (Mixins::GoImpl(), 0)... };
    }
};
int main()
{
    Foo<A, B> foo;
    foo.Go();  // ERROR: illegal call of non-static member function
    return 0;
}

这在GCC或CLANG中恰好编译,但在Visual Studio 2017中失败了:

错误c2352:'a :: goimpl':非静态成员函数的非法呼叫

我没有找到有关此的任何具体信息。这只是编译器中的错误(或未完成功能),还是我缺少一些伏都教?您能建议任何解决方法吗?我特别尝试在每个基类上调用基类功能。

作为解决方案,尝试

    int temp[] = { 0, (this->Mixins::GoImpl(), 0)... };

    int temp[] = { 0, (static_cast<Mixins*>(this)->GoImpl(), 0)... };