1

重现问题的示例代码:

#include <iostream>

template< typename T, typename Func >
void action(Func T::* func)
{
    T entry;
    (entry.*func)();
}

struct A
{
    void f()
    {
        std::cout << "A::f()" << std::endl;
    }
};

int main()
{
    action(&A::f);
    return 0;
}

此代码使用 MS VC++2008 成功编译,VC++2015 使用 vc140 工具集,但在 VC++2015 项目中使用 vc90 (VC++2008) 工具集时编译失败。给出奇怪的诊断

cpptest.cpp(20): error C2664: 'action' : cannot convert parameter 1 from 'void (__thiscall A::* )(void)' to 'void (A::* )(void)'
      Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

推断 Func 的类型时,编译器似乎丢失了 __thiscall 调用约定说明符。试图在代码的不同部分强行指定 __thiscall 但没有成功。由于各种依赖关系,将整个项目转换为 vc14 工具集不是一种方法,并且将其保留在 VS 2008 下是一种不太可能的方法。有什么想法可以强制编译器理解这种结构吗?

更新

将代码更改为

template< typename T, typename Func >
void action(Func func)
....

并调用action< A >( &A::f );工作,但看起来有点难看 - 我希望编译器能够自动推断两个模板参数(T和Func)的类型

4

0 回答 0