iphone编译器继承了模板化基类,传递的类型没有及时扩展(看看)

问题描述 投票:0回答:2

试试这个:

    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 就像它不存在一样。

有什么想法吗?

c++ iphone templates
2个回答
4
投票

您收到的错误是正确的(其他编译器不应该接受该代码并且错误地这样做了);变量

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


2
投票

someBaseMember
是一个似乎不依赖于模板参数的名称,因此它不是标准所称的依赖名称

C++ 名称查找规则导致编译器不会在模板化基类中查找该名称,因为它不是依赖名称。要解决此问题,您可以使用

this->
来明确
someBaseMember
是该类的成员(因此隐式依赖于模板参数):

this->someBaseMember = 0;

这不是特定于 iphone 编译器的,而是在语言中定义的。另请参阅 C++ FAQ Lite 中的此条目了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.