此代码在GNU编译器中产生错误:
class A
{
public:
int X;
};
template<class T>
class Foo : public T
{
public:
void doStuff();
};
template<class T>
void Foo<T>::doStuff()
{
X++;
}
为什么这是一个错误已经an answer。我想知道是否有另一种解决此错误的方法而不是使用
T::X
每次我想引用X成员。我试过这个:
template<class T>
void Foo<T>::doStuff()
{
using T::X;
X++;
}
但是GCC给出了一个错误:“不允许使用类限定名称”
答案 0 :(得分:8)
using T::X
应该有效。如果它给出了错误,那么代码中存在一些其他问题,或者它必须是编译器错误。看看自己:http://www.ideone.com/MI9fM
您可以使用this
指针作为
template<class T>
void Foo<T>::doStuff()
{
this->X++;
}
这为编译器提供了一个提示,在哪里查找符号X
。
演示:http://www.ideone.com/NIucO
您也可以这样做:
template<class T>
void Foo<T>::doStuff()
{
T::X++;
}
答案 1 :(得分:3)
这也有效:
this->X++;
这会告诉编译器,因为它认为X不是派生类的成员,它必须来自模板库,不需要担心它。
答案 2 :(得分:1)
class A
{
public:
int X;
};
template<class T>
class Foo : public T
{
public:
using T::X;
void doStuff();
};
template<class T>
void Foo<T>::doStuff()
{
X++;
}
int main()
{
Foo<A> o;
o.doStuff();
}
答案 3 :(得分:0)
也许这会奏效吗?只是猜测:
int &X = T::X;
这将创建一个可在代码块中使用的别名,类似于您尝试过的using T::X
不起作用。