C++ IPhone编译移植代码问题:调用静态模板函数';s在模板化类中==失败 模板结构AClass { 公众: 模板 静态void AFunc() {} }; 模板 void ATestFunc() { AClass::AFunc(); }

C++ IPhone编译移植代码问题:调用静态模板函数';s在模板化类中==失败 模板结构AClass { 公众: 模板 静态void AFunc() {} }; 模板 void ATestFunc() { AClass::AFunc(); },c++,iphone,templates,C++,Iphone,Templates,这适用于其他平台,但不适用于iPhone。在调用该函数的行中,我收到一个错误“在'int'之前预期主表达式” 如果让我做的话,效果很好 template<typename T> struct AClass { public: template<typename T0> static void AFunc() {} }; template<typename T> void ATestFunc() { AClass<

这适用于其他平台,但不适用于iPhone。在调用该函数的行中,我收到一个错误“在'int'之前预期主表达式”

如果让我做的话,效果很好

template<typename T> struct AClass
{
public:
     template<typename T0>
     static void AFunc()
     {}
};

template<typename T>
void ATestFunc()
{
     AClass<T>::AFunc<int>();
}
AClass::AFunc();
如果我们也放弃函数的模板参数,它也可以正常工作:

AClass<int>::AFunc<int>();
模板结构AClass
{
公众:
静态void AFunc()
{}
};
模板
void ATestFunc()
{
AClass::AFunc();
}

关于为什么它不能与iPhone一起使用,有什么想法吗?

尝试将行
AClass::AFunc()
更改为
AClass::template AFunc() < /P>作为一个数据点,这两个平台在GCC 4.3中产生相同的错误,而在线COMUE C++编译器(众所周知的完整和良好的错误消息)在“代码> AFunc < /COD> > < <代码> int >代码中标记为“错误:类型名称不允许”。因此,我认为可以肯定地说,它在iPhone上不起作用的原因是它的代码无效——尽管我不是把它作为一个答案发布,希望有人能回答为什么它无效。为什么(谢谢!这很好用!(好吧,不管怎样,它还是编译的)请随意展示你的作品,我知道为什么需要它:)哦,现在我明白了!假设您生成了一个新的AClass专门化(例如),它定义了AFunc的非模板版本。现在假设调用ATestFunc()。这将引用AClass的专用版本,它将引用AFunc的非模板版本。因此,在编写ATestFunc时,编译器无法知道AFunc是否实际是模板化的,因为它不知道您将引用此AClass专门化还是另一个AClass专门化,因此,您需要明确地告诉它它是模板化的。另请参见:在所有这些之后,我可以很容易地理解为什么VC++和其他编译器在实际使用和实例化模板代码之前完全忽略模板化代码,因此编译器知道所有模板参数。主要的缺点是,有时语法错误不会出现,直到一些可怜的灵魂真正去尝试并使用该函数。但是说实话,无论如何,你都应该测试你的代码,我说,如果它能避免已经非常复杂的主题(比如模板)变得复杂,我完全赞成!
template<typename T> struct AClass
{
public:

     static void AFunc()
     {}
};

template<typename T>
void ATestFunc()
{
     AClass<T>::AFunc();
}