У меня есть шаблон класса, который наследуется от шаблона базового класса.
В шаблоне базового класса есть элемент данных с шаблоном функции-члена, который я хочу вызывать из своего суперкласса.
Я знаю, что для устранения неоднозначности вызова шаблона функции-члена я должен использовать ключевое слово 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;
}