在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
Calling base-class members by expanding each parameter pack fails in Visual Studio 2017
考虑以下代码:
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)... };
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 组件X86转换为ARM功能呼叫,其中有不同数量的参数为ARM
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- C 函数呼叫没有足够的模板参数
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- GDB呼叫函数 - 如何使用std :: cout作为参数
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- 编写函数的定义,该函数接受可呼叫函数作为参数