假设我有两个类(实际上更多,但在我的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还是我需要找到一个替代方案(那么建议的替代方案将不胜感激)?
答案 0 :(得分:1)
你必须写
helper.template apply<A>();
Visual Studio接受这种(错误的)语法。