2014-02-20 41 views
0

嗨,我有以下几点:使用indefined类型的

class A; // forward declaration of class A 
void A::foo(int, int); // forward declaration of member function foo of A 

class Functor 
{ 
public: 
    Functor(const A* in_a):m_a(in_a){} 
    virtual ~Functor(){m_a= 0;}; 

    virtual void Do(int,int) = 0; 

protected: 
    const A* m_a; 
}; 

class FunctorDerived: public Functor 
{ 
    FunctorDerived(const A* in_a):Functor(in_a){} 

    void Do(int in_source, int in_target) 
    { 
     m_a->foo(in_source, in_target); 
    } 
}; 


class A 
{ 
    .... 
    void foo(int, int); 
    .... 
} 

当编译编译器会告诉:

error C2027: use of undefined type 'A' 
see declaration of 'A' 

看来,一个不被编译器识别,虽然我向前宣布它也向前声明我需要使用的成员函数(A :: foo)。

我确切地说,一切都写在一个单一的文件。

你能帮我理解我做错了什么吗?

感谢您的帮助

纳撒尼尔

回答

1

打动你的A在上面定义。然后,如果你需要实现foo

class A 
{ 
    void foo(int, int); 
} 

class Functor 
{ 
public: 
    Functor(const A* in_a):m_a(in_a){} 
    virtual ~Functor(){m_a= 0;}; 

    virtual void Do(int,int) = 0; 

protected: 
    const A* m_a; 
}; 

class FunctorDerived: public Functor 
{ 
    FunctorDerived(const A* in_a):Functor(in_a){} 

    void Do(int in_source, int in_target) 
    { 
     m_a->foo(in_source, in_target); 
    } 
}; 

void A::foo(int x, int y) 
{ 
    //do smth 
} 
0

m_a-> - 你访问一个A*。此时编译器需要A的完整定义。

总之:前置声明不起作用。提供完整的类型。

+0

不,它不。这只是普通的C语言,你可以通过只提供前向声明来调用函数......这对于编译器来说已经足够了,链接时需要定义 –

+0

不,它是C++,它是一个成员函数。 –

+0

是的大声笑我知道我正在写C++ ...我刚刚明白你的意思,我以为你告诉你要提供函数定义,实际上你告诉了提供完整的类定义。所以我所知道的一天是没有办法向前宣布一个成员函数! –