gcc 4.5.1 против частичной специализации шаблона VC2010: что соответствует C ++ 0x? - PullRequest
3 голосов
/ 20 февраля 2011

Следующие компиляции с VC2010, но не с gcc 4.5.1 с -std = c ++ 0x :

template <class T, class TBase>
class TestBase : public TBase
{
public:
// Helper functor
    template <unsigned int t_u, class TRet = int>
    struct Helper
    {
        TRet operator() (int x = 0, int y = 0)
        {
                return (TRet)t_u;
        }
    };
}; // class TestBase

template<class TBase>
class Test0 : public TestBase<Test0<TBase>, TBase>
{
public:
    Helper<100> Get100; // gcc 4.5.1 error: 'Helper' does not name a type
};

gcc принимает более подробный:

template<class TBase>
class Test1 : public TestBase<Test1<TBase>, TBase>
{
    typedef TestBase<Test1<TBase>, TBase> thisBase;
public:
    typename thisBase::template Helper<100> Get100;
};

Что (если есть) соответствует c ++ 0x?

1 Ответ

2 голосов
/ 20 февраля 2011

В первом фрагменте кода Helper не является зависимым именем.Поскольку он не зависит, он должен быть разрешен при разборе шаблона, а не при его создании.Это требуется как в C ++ 03, так и в C ++ 0x.

Использование typedef делает его зависимым именем, поэтому оно разрешается при создании экземпляра.Вы также можете использовать typename Test1 :: template Helper <100>.

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