我有这种形式的构造:
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'?
答案 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 ++关键字。