我一直在編程模板結構,並使其工作後,我決定在其他項目上使用它。該模板包含兩個文件。 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
發佈標題和來源。 – 2011-06-06 22:38:22