是否有另一种模板基类继承的解决方法?

时间:2011-02-11 19:57:41

标签: c++ templates inheritance gcc

此代码在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给出了一个错误:“不允许使用类限定名称”

4 个答案:

答案 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++;
    }
    

演示:http://www.ideone.com/PswvG

答案 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不起作用。