我可以在fnc def中使用吗?

时间:2011-10-18 10:33:06

标签: c++ templates

我有这种形式的构造:

template<class X>
struct Base
{
  X get_data()
  {
    return X();
  }
};

template<class X>
struct Derived : Base<X>
{
  X do()
  {
    auto v = get_data();//this get is from Base
  }

};

我尝试使用此get,因为它显示但我得到错误:'get_data'没有依赖于模板参数的参数,因此'get_data'的声明必须可用[-fpermissive] | <登记/> 好的,我试过了:

X do()
{
  using Base<T>::get_data;
  auto v = get_data();//this get is from Base
}

我有以下error: 'Derived<T>::Base' is not a namespace。现在,我在这里遇到了一个问题,因为事实上,正式的Base是一个结构体是一个命名空间(特殊形式),但无论如何,我声明在任何fnc之外使用Base<T>::get_data;并编译。所以Q是:在fnc体内是否允许编译器错误或使用'using declaration'?

3 个答案:

答案 0 :(得分:1)

替换

using Base<T>::get_data;

using Base<X>::get_data;

答案 1 :(得分:1)

auto v = this->get_data();

答案 2 :(得分:1)

基类成员名称的

using指令仅在类级别有意义,它们用于使基类成员的名称可见,否则可能会被隐藏。

它们在功能范围内没有意义,因此不允许在那里。

你可以做的是:

struct Derived : public Base<X>
{
  using Base<X>::get_data;
  //...
};

(这只是明智的,因为你的模板上下文以及get_data()不依赖于任何模板参数这一事实。在普通的课程中,如果你不是这样的话,根本就不需要这个故意隐藏这个功能。)

在函数范围内,允许的唯一using指令是从其他名称空间引入名称的指令,用于依赖于参数的查找。

另请注意,do是C ++关键字。