2013-10-31 42 views
0

我有一個類,我內聯的構造函數和析構函數,我也有一個類的靜態方法。我在內聯析構函數內部調用了這個靜態方法,但是我對該靜態方法有一個鏈接器錯誤未定義的引用。我很確定它被編譯並與對象鏈接。這裏的代碼,未定義引用與內聯析構函數

// CFoo.h 
namespace barname { 
class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 

    static void fooMethod(); 
}; 

inline CFoo::CFoo() 
{ 
} 

inline CFoo::~CFoo() 
{ 
    fooMethod(); 
} 
} 

// SomeOtherSource.cpp 
namespace barname 
{ 
    void CFoo::fooMethod() 
    { 
    } 
} 

看來代碼是好的,並編譯。

+5

'在線Cfoo的編譯OK ():: CFoo()'a nd'inline CFoo()::〜CFoo()'甚至不是有效的C++。如果你花時間去分享一個SSCCE,謝謝,並且請嘗試張貼實際*編譯*的代碼,因爲與你的問題的評論相反,這是* not *。 (和固定的,這編譯叮噹罰款)。 – WhozCraig

+0

我無法重現您正在描述的問題(修復語法錯誤之後)。看起來像你上面的SSCCE未能捕捉到原始代碼中重要的東西。 – greatwolf

回答

1

這是在其他文件中的代碼

Coliru example

#include <iostream> 
#include <string> 
#include <vector> 

namespace barname 
{ 
    class CFoo 
    { 
    public: 
     CFoo(); 
     ~CFoo(); 

     static void fooMethod(); 
    }; 

    inline CFoo::CFoo() 
    { 
    } 

    inline CFoo::~CFoo() 
    { 
     fooMethod(); 
    } 

    void CFoo::fooMethod() 
    { 
     std::cout << "in fooMethod" << std::endl; 
    } 
} 


int main() 
{ 
    barname::CFoo *f = new barname::CFoo(); 
    delete f; 
} 
+0

是的。但fooMethod是在另一個源文件中定義的。 – domlao

1
#ifndef con001_CFoo_h 
#define con001_CFoo_h 

namespace barname { 
class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 


    static void fooMethod(); 
}; 
inline CFoo::CFoo() 
{ 

} 

inline CFoo::~CFoo() 
{ 

} 

} 

#endif 

稍加修改的工作版本

#include "CFoo.h" 
namespace barname 
{ 
void CFoo::fooMethod() 
{ 
} 
} 

中的XCode 4.6