Недопустимый вывод шаблона функции-члена, зависящего от шаблона -думает, что я& #39;m пытаюсь использовать стандартный набор ::

У меня есть шаблон класса, который наследуется от шаблона базового класса.

В шаблоне базового класса есть элемент данных с шаблоном функции-члена, который я хочу вызывать из своего суперкласса.

Я знаю, что для устранения неоднозначности вызова шаблона функции-члена я должен использовать ключевое слово templateи явно ссылаться на thisв суперклассе.

this->base_member_obj.template member_function<int>();

Все это хорошо, за исключением того, что кодовая база, которую я использую, допустила довольно досадную ошибку, импортировав весь namespace std, а функция-член шаблона, которую я пытаюсь вызвать, называется set. Где-то во фреймворке включен std::set, и это заставляет GCC думать, что я пытаюсь объявить std::set, а не вызывать функцию-член set.

GCC 4.7 выдает ошибку неправильное использование 'class std ::set'

См. ниже пример, показывающий ошибку . Если вы закомментируете using namespace std, код компилируется нормально.

К сожалению, я не могу просмотреть всю кодовую базу, удалить каждый вызов using namespace stdи добавить к каждому вызову в пространстве имен std префикс std::

. Есть ли другой способ обойти это?

#include <set>
using namespace std; // comment this out to compile fine

struct blah
{
    template<typename T>
    void set()
    { }
};

template<typename T>
struct base
{
    blah b;
};

template<typename T>
struct super : base<super<T>>
{
    void fun()
    {
        this->b.template set<int>(); // this line breaks
    }
};

int main()
{
    super<int> s;
    s.fun();

    return 0;
}
6
задан Steve Lorimer 3 May 2012 в 06:55
поделиться