试试这个:
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 未定义' 在 'someBaseMember = 0;' 行
iphone 编译器似乎比其他编译器更快地“解析”模板化代码,(据我所知,大多数其他编译器甚至在您实际调用函数或实例化实例之前都不会检查它们。 )
据我所知,它解析得太快了,以至于它甚至还没有解析基类:它就像它不存在一样。
有什么想法吗?
最佳答案
你得到的错误是正确的(其他编译器不应该接受代码并且错误地这样做);变量 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
关于c++ - iphone 编译器继承了模板化基类,传递类型没有及时扩展(看看),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369553/