C ++ с помощью оператора в области функций-членов - PullRequest
6 голосов
/ 24 февраля 2011

Если я хочу использовать элемент базового класса шаблона из производного от шаблона класса, я должен ввести его в сферу следующим образом:

template <typename T>
struct base
{
    void foo();
};

template <typename T>
struct derived : base<T>
{
    using base<T>::foo;
};

Почему я не могу поместить это с помощью оператора using влокальная область видимости, как и другие операторы использования?

template <typename T>
struct base
{
    void foo();
};

template <typename T>
struct derived : base<T>
{
    void f()
    {
        using base<T>::foo;  // ERROR: base<T> is not a namespace
    }
};

Ответы [ 2 ]

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

Цель using base<T>::foo в области действия функции заключается в том, что вы хотите вызвать foo в функции, и, поскольку она выдает ошибку, вы не можете этого сделать.

Если вы хотите вызвать functon (в противном случае, почему вы это сделаете), вы можете сделать следующее:

this->template base<T>::foo(); //syntax 1
this->base<T>::foo();          //syntax 2 - simple
this->foo();                   //syntax 3 - simpler

Однако, вы не можете написать это:

foo() ;  //error - since foo is in base class template!
//if you write `using base<T>::foo` at class scope, it will work!

Демонстрация на ideone: http://www.ideone.com/vfDNs

Прочтите это, чтобы узнать, когда должен использовать ключевое слово template в вызове функции:

Гадкие ошибки компилятора с шаблоном

1 голос
/ 24 февраля 2011

Стандарт (черновик 3225) гласит: [namespace.udecl]:

A объявление-использования для члена класса должно быть объявлением-членом . [Пример:

struct  X  {
    int  i;
    static  int  s;
};
void  f()  {
    using  X::i; // error:  X::i is a class member
                 // and this is not a member declaration.
    using  X::s; // error:  X::s is a class member
                 // and this is not a member declaration.
}

- конец примера]

A директива using не имеет таких ограничений, однако ([namespace.udir]):

при поиске namespace-name в using-директиве , учитываются только имена пространств имен

...