如果我想从模板派生类中使用模板基类的成员,我必须将其纳入范围:
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
}
};
答案 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
关键字的时间:
答案 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 时,只考虑名称空间名称