2011-06-06 21 views
2

我一直在編程模板結構,並使其工作後,我決定在其他項目上使用它。該模板包含兩個文件。 ListOctree.cpp和ListOctree.h。 雖然他們自己編譯和運行得很好(我可以運行結構自檢)。使用不在根項目目錄(包含在搜索路徑中的文件)的源文件時出現鏈接錯誤(Visual C++)

在另一個項目中使用它們時,兩個ListOctree.cpp/.h位於./Util目錄中,但Visual Studio似乎找到.h文件(我可以在項目的任何位置使用.h聲明) ,它似乎找不到所有在.h聲明的代碼都被聲明的.cpp源文件。

這些文件是該項目的一部分。 ists樹是這樣的:

program.cpp <-- includes "Util/ListOctree.h" 
/Util 
    ListOctree.cpp 
    ListOctree.h 

ListOctree中的所有類和函數都屬於Util命名空間。

的Visual C++拋出的錯誤是: 錯誤LNK2019:símbolo外路 「市民:__thiscall的Util :: ListOctree :: ListOctree(INT)」(...)罪解析...

APROX。英文: 錯誤LNK2019:外部符號「public:__thiscall Util :: ListOctree :: ListOctree(int)」(...)未解決...

重建解決方案時,編譯Util/ListOctree.cpp生成.obj文件,但似乎無法將它鏈接在一起

我也可以發佈.h文件,但是我發現它太長了以至於無法發佈。

附件:哪裏,我如何使用.h文件

#include "Util/ListOctree.h" 
//... 
void main(){ 
//... 
    ListOctree<int>* a = new ListOctree<int>(8); 
//... 
} 

附件:的Util/ListOctree.h

#ifndef __UTIL_LISTOCTREE 
#define __UTIL_LISTOCTREE 

//Conditional compilation flags 

#undef _SELFTEST 
#undef _DEBUG_LISTOCTREE 

//Conditional compilation options 
#ifdef _DEBUG_LISTOCTREE 
#undef _DEALLOCATE_LISTS 
#define _SELFTEST 
#endif 

#ifdef _SELFTEST 
#include <iostream> 
#endif 

#ifdef _SELFTEST 
#include<assert.h> 
#endif 

#ifdef _DEBUG_LISTOCTREE 
#include <iostream> 
#endif 
///////////////////////////////// 

#include <deque> 
#include <list> 
#include <iterator> 
#include <math.h> 
#include <exception> 

//Remind me to never do this again. (xYz,XYz,XYZ,xYZ,xyz,Xyz,XyZ,xyZ,) 
//A CAPS character means positive in the axis while a 
//Lowercase character means negative 
//FIXME Never used I think. 
#define _xyz sons[0] 
#define _xyZ sons[1] 
#define _xYz sons[2] 
#define _xYZ sons[3] 
#define _Xyz sons[4] 
#define _XyZ sons[5] 
#define _XYz sons[6] 
#define _XYZ sons[7] 

namespace Util{ 
/** 
* @brief The node class 
* 
* Each node stores up to 8 sons, a parent pointer and, if it 
* is a Leaf node, a list of contents. 
*/ 
template <typename T> class Node{ 
    //Attributes 
public: 
    ///An array with all the sons 
    Node<T>* sons[8]; 
    ///A parent pointer 
    Node<T>* parent; 

    //The node contents (if any) 
    std::list<T>* c; 

    //Methods 
public: 
    /// Deallocates itself AND all of it's sons 
    ~Node(); 
    /// Creates an empty node 
    Node(); 
    /// Creates a node with its eight sons and a parent reference from an 9 pointer array 
    Node(Node<T>** nodes); 
    ///Returns the node contents 
    std::list<T>* getContents(){return c;}; 
    ///Pushes an item into the node 
    void pushItem(T item); 
    ///Removes an item from the node 
    void eraseItem(T item){c->erase(item);}; 
    ///Clears the node contents 
    void clearNode(){c->clear();}; 
}; 

/** 
* @brief Container for @see Node classes 
* 
* This class allows a more convenient way of working with Octrees 
*/ 
template <typename T> class ListOctree { 
    //Attributes 
private: 
    int width; 
    Node<T>* root; 

    //Methods 
public: 
    ListOctree(int width); 
    ~ListOctree(); 
    void pushItemAt(T item, int x, int y, int z); 
    void eraseItemAt(T item, int x, int y, int z); 
    void clearItemsAt(int x, int y, int z); 
    std::list<T>* getItems(); 
    std::list<T>* operator() (int x, int y, int z){return(getItemsAt(x,y,z));}; 
    std::list<T>* getItemsAt(int x, int y, int z); 
private: 
    char nextNode(int x, int y, int z, int* cx, int* cy, int* cz, int width, Node<T>* n, bool createNew) throw(...); 
    void _pushItemAt(T item, int x, int y, int z, int cx, int cy, int cz, int width, Node<T>* n); 
    void _eraseItemAt(T item, int x, int y, int z, int cx, int cy, int cz, int width, Node<T>* n); 
    void _clearItemsAt(int x, int y, int z, int cx, int cy, int cz, int width, Node<T>* n); 
    std::list<T>* _getItemsAt(int x, int y, int z, int cx, int cy, int cz, int width, Node<T>* n); 
    void prune(Node<T>* n); 
    void addItemsToList(std::list<T>* lst, Node<T>* n); 
}; 

/** 
* @brief Exception used internally 
* 
* FIXME, never used, can't be used for some reason 
*/ 
class ListOctreeException : public std::exception{ 
private: 
    std::string msg; 

public: 
    ListOctreeException(){msg="ListOctreeException";}; 
    ListOctreeException(std::string s){msg=s;}; 
    const char* what(){return(msg.c_str());}; 
}; 
};//namespace 
#endif 
+0

發佈標題和來源。 – 2011-06-06 22:38:22

回答

0

模板的聲明和定義應保存在同一個文件中(通常爲.h)。有關詳細信息,請參見the FAQ(技術上也可以在包含實現(see this also))的文件中實例化模板。

關鍵字export本來應該在兩者分開的情況下使用,但很少有編譯器實現它,現在它已在C++ 0x中被刪除。

+0

因此,所有的模板代碼都必須插入到.h文件中? .cpp相當大。 另外。將工作做類似於: cat ListOctree.h ListOctree.cpp> ListOctree_new.h 然後包括新文件。 – NeonMan 2011-06-06 23:52:35

+0

@NeonMan是的,然後可以包含.h。 – jonsca 2011-06-06 23:54:50

+0

在您回答時編輯。見先前的帖子plz。 – NeonMan 2011-06-06 23:56:00

0

有你在溶液中的項目之間的參考? (Visual Studio 2010中)

右鍵點擊項目 - >引用

或者,你加入一個項目的依賴? (Visual Studio 2008)

+0

這些文件是該項目的一部分。一個項目的解決方案。沒有嘗試使用多個項目 – NeonMan 2011-06-06 23:00:08

+1

你應該在你的問題中澄清一下。你說,「在另一個項目上使用它們時......」。 – Nathanael 2011-06-06 23:01:53

+1

但是,由於這不是問題,我們將無法在沒有看到您的一些源代碼的情況下爲您提供幫助。 – Nathanael 2011-06-06 23:03:32

相關問題