компилятор iphone унаследовал шаблонные базовые классы с пропущенным сквозным типом, который не расширяется во времени (просто посмотрите) - PullRequest
0 голосов
/ 03 марта 2010

Попробуйте это:

    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, кажется, «разбирает» шаблонный код намного раньше, чем другие компиляторы (из того, что я могу сказать, большинство других даже не проверяет синтаксис, пока вы на самом деле не ВЫЗЫВАЕТЕ функцию или не создаете экземпляр. )

Из того, что я могу сказать, он разбирает его так быстро, что он еще даже не проанализировал базовый класс: S, как будто его не существует.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 03 марта 2010

Ошибка, которую вы получаете, является правильной (другие компиляторы не должны принимать код и делают это по ошибке); переменная someBaseMember зависит от экземпляра шаблона Base<T>, но эта зависимость не была выражена в вашем использовании, и поэтому компилятор корректен при попытке разрешить ее независимо от параметра шаблона.

Вы можете решить эту проблему, сделав эту зависимость явной, заставив компилятор разрешить переменную, используя экземпляр шаблона. Вы можете использовать любой из следующих вариантов:

this->someBaseMember = 0;

OR

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 голосов
/ 03 марта 2010

someBaseMember - это имя, которое, кажется, не зависит от параметров шаблона, поэтому оно не является зависимым именем , как его называют в стандарте.

Правила поиска имен в C ++ приводят к тому, что компилятор не ищет в шаблонном базовом классе это имя, поскольку оно не является зависимым именем. Чтобы обойти это, вы можете использовать this->, чтобы прояснить, что someBaseMember является членом класса (и поэтому неявно зависит от параметров шаблона):

this->someBaseMember = 0;

Это не относится к компилятору iphone, но определено так в языке. См. Также эту запись в C ++ FAQ Lite для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...