无法编译在不同类上调用静态函数的代码

时间:2017-09-07 20:29:05

标签: c++ templates static

假设我有两个类(实际上更多,但在我的MCVE中只有2个)定义了两个具有完全相同名称的静态函数:

class A
{
public:
    static void doSomething() {};
    static void doSomethingElse() {};
};

class B
{
public:
    static void doSomething() {};
    static void doSomethingElse() {};
};

我想为所有可用类调用其中一个函数。所以我创建了一个辅助函数:

template<class Helper> static void ApplyToAllTypes( Helper& helper )
{
    helper.apply<A>();
    helper.apply<B>();
}

然后我这样做在所有类上调用doSomething

class doSomethingHelper
{
public:
    template<class T> static void apply()
    {
        T::doSomething();
    }
};

void doSomethingToAll()
{
    doSomethingHelper helper;
    ApplyToAllTypes<doSomethingHelper>( helper );
}

这就是在所有课程上调用doSomethingElse

class doSomethingElseHelper
{
public:
    template<class T> static void apply()
    {
        T::doSomethingElse();
    }
};

void doSomethingElseToAll()
{
    doSomethingElseHelper helper;
    ApplyToAllTypes<doSomethingElseHelper>( helper );
}

使用MSVC编译时工作正常,但是当我尝试用g ++编译它时,它会抱怨:

In static member function 'static void ApplyToAllTypes()':
 error: expected '(' before '>' token
         helper.apply<A>();

这真的无效吗?是应该以任何方式修复sytax还是我需要找到一个替代方案(那么建议的替代方案将不胜感激)?

1 个答案:

答案 0 :(得分:1)

你必须写

helper.template apply<A>();

Visual Studio接受这种(错误的)语法。