C++ iphone编译器继承了传递类型为未及时扩展的模板基类(只需查看)
试试这个:C++ iphone编译器继承了传递类型为未及时扩展的模板基类(只需查看),c++,iphone,templates,compiler-construction,C++,Iphone,Templates,Compiler Construction,试试这个: template <typename T> class Base { public: int someBaseMember; }; template <typename T> class Test: public Base<T> { public: void testFunc() {
template <typename T>
class Base
{
public:
int someBaseMember;
};
template <typename T>
class Test: public Base<T>
{
public:
void testFunc()
{
someBaseMember = 0;
}
};
模板
阶级基础
{
公众:
int-someBaseMember;
};
模板
类测试:公共基
{
公众:
void testFunc()
{
someBaseMember=0;
}
};
在vc++和psp编译器(以及我遇到的任何其他编译器)中,上面的代码都可以正常工作,在iphone编译器(对于设备,我认为GCC4.2,设置了-fpPermissive标志)中,我得到一个错误,即
“未定义someBaseMember”
上
'someBaseMember=0;'
线
iphone编译器似乎比其他编译器更快地“解析”模板化代码(据我所知,大多数其他编译器在实际调用函数或实例化实例之前都不会检查它们的语法)
据我所知,它很快就解析了它,甚至还没有解析基类:它好像不存在
有什么想法吗?您得到的错误是正确的(其他编译器不应该接受代码,并且这样做是错误的);变量
someBaseMember
依赖于Base
的模板实例,但是这种依赖性在您的使用中没有表达出来,因此编译器尝试独立于模板参数来解析它是正确的
您可以通过使此依赖显式化来解决此问题,从而强制编译器使用模板实例解析变量。您可以使用以下任一选项:
此->someBaseMember=0;
或
Base::someBaseMember=0;
以上任何一项都会产生您想要的解决机制
编辑您可能想看到C++ FAQ Lite的相关部分:
您得到的错误是正确的(其他编译器不应该接受该代码,并且这样做是错误的);变量
someBaseMember
依赖于Base
的模板实例,但是这种依赖性在您的使用中没有表达出来,因此编译器尝试独立于模板参数来解析它是正确的
您可以通过使此依赖显式化来解决此问题,从而强制编译器使用模板实例解析变量。您可以使用以下任一选项:
此->someBaseMember=0;
或
Base::someBaseMember=0;
以上任何一项都会产生您想要的解决机制
编辑您可能想看到C++ FAQ Lite的相关部分:
someBaseMember
是一个似乎不依赖于模板参数的名称,因此它不是标准所称的依赖名称
C++名称查找规则使编译器不为这个名称查看模板基类,因为它不是依赖名称。要解决此问题,可以使用
this->
来明确someBaseMember
是类的成员(因此隐式地依赖于模板参数):
这不是特定于iphone编译器的,而是在语言中定义的。有关更多详细信息,请参见。
someBaseMember
是一个似乎不依赖于模板参数的名称,因此它不是标准所称的依赖名称
C++名称查找规则使编译器不为这个名称查看模板基类,因为它不是依赖名称。要解决此问题,可以使用
this->
来明确someBaseMember
是类的成员(因此隐式地依赖于模板参数):
这不是特定于iphone编译器的,而是在语言中定义的。有关更多详细信息,请参见
this->someBaseMember = 0;