试试这个:
template <typename T>
class Base
{
public:
int someBaseMember;
};
template <typename T>
class Test: public Base<T>
{
public:
void testFunc()
{
someBaseMember = 0;
}
};
在 vc++ 和 psp 编译器(以及我遇到的任何其他编译器)中,上面的内容可以正常工作,而使用 iphone 编译器(对于设备,我认为 gcc 4.2,设置了 -fpermissive 标志)我收到一条错误消息 'someBaseMember 未定义' 于 '一些BaseMember = 0;' 线
iphone 编译器似乎比其他编译器更快地“解析”模板化代码(据我所知,大多数其他编译器甚至不会对它们进行语法检查,直到您实际调用函数或实例化实例为止。)
据我所知,它解析它的速度如此之快,以至于它甚至还没有解析基类:S 就像它不存在一样。
有什么想法吗?
您收到的错误是正确的(其他编译器不应该接受该代码并且错误地这样做了);变量
someBaseMember
取决于 Base<T>
的模板实例,但这种依赖关系尚未在您的使用中表达出来,因此编译器尝试独立于模板参数解析它是正确的。
您可以通过明确此依赖关系来解决此问题,从而强制编译器使用模板实例解析变量。您可以使用以下任一方法:
this->someBaseMember = 0;
或
Base<T>::someBaseMember = 0;
上述任何一项都应该会产生您想要的解决机制。
编辑
您可能想查看 C++ FAQ Lite 的相关部分:
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18
someBaseMember
是一个似乎不依赖于模板参数的名称,因此它不是标准所称的依赖名称。
C++ 名称查找规则导致编译器不会在模板化基类中查找该名称,因为它不是依赖名称。要解决此问题,您可以使用
this->
来明确 someBaseMember
是该类的成员(因此隐式依赖于模板参数):
this->someBaseMember = 0;
这不是特定于 iphone 编译器的,而是在语言中定义的。另请参阅 C++ FAQ Lite 中的此条目了解更多详细信息。