C ++在成员函数范围中使用语句

时间:2011-02-24 04:45:04

标签: c++ templates using-declaration

如果我想从模板派生类中使用模板基类的成员,我必须将其纳入范围:

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

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

为什么我不能将此using语句放入本地范围,就像其他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 个答案:

答案 0 :(得分:2)

函数范围中using base<T>::foo的目的是要在函数中调用foo,并且因为它会出错,所以你不能这样做。

如果您想要调用功能(否则为什么会这样做),那么您可以执行以下操作:

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关键字的时间:

Ugly compiler errors with template

答案 1 :(得分:1)

标准(草案3225)在[namespace.udecl]中说:

  

类成员的 using-declaration 应为 member-declaration 。 [例如:

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.
}
  

- 结束示例]

using-directive 没有这样的限制,但是([namespace.udir]):

  

using-directive 中查找 namespace-name 时,只考虑名称空间名称