конкретная проблема с пользовательскими компараторами и шаблонами - PullRequest
0 голосов
/ 12 мая 2011

Прошу прощения за столь большой вопрос, но я столкнулся с другой проблемой, не знаю, как решить ... Из того, что я понял, gcc не удается разрешить myComparator тип класса, вероятно, потому что следующий код не соответствует стандарту.Вопрос в том, что я что-то упустил или есть обходной путь для этой проблемы, который не потребовал бы слишком больших изменений (например, решение интерфейсов) ...

template <typename DATA> class myArray
{
    template <typename F> void sort (F &comp)
    {
        // No problems here
    }

    template <typename T> void sort(void)
    {
        T::myComparator cmp; //Error: expected `;' before 'zzz'
        // T::template myComparator cmp; also doesn't work
        sort(cmp);
    }
};

class test
{
public:
    class myComparator
    {
    public:
        bool operator() ( const test *t1, const test * t2)
        {
            // No problems here
        }
    };
};

void testCmp()
{
    myComparator cmp;
    cmp.sort<test>();
}

1 Ответ

1 голос
/ 12 мая 2011

Вы должны использовать typename как:

  typename T::myComparator cmp; 
//^^^^^^^

typename требуется, потому что myComparator является зависимым именем.

Смотрите этот FAQ по C ++ в самом стеке:

«Где и почему я должен ставить template и typename на зависимые имена?»

...