2012-03-21 60 views
0

我在C++編寫的代碼:致命錯誤LNK1120:在C 1周無法解析的外部++

#include<iostream> 
#include<string> 
#include<map> 
#include<set> 
#include<list> 
#include<vector> 
#include<fstream> 

using namespace std; 

#ifndef u32 
typedef unsigned int u32; 
#endif 

vector<string> get_NodeProps(){ 
    vector<string> NodeProps; 
    NodeProps.push_back("ObjType"); 
    NodeProps.push_back("Nexus"); 
    return NodeProps; 
}; 
vector<string> NodeProps = get_NodeProps(); 

map<u32,string> create_OMSSObj_map(){ 
    map<u32,string> OMSSObjTypeByID1; 
    OMSSObjTypeByID1.insert(pair<u32,string>(768,"storage")); 
    OMSSObjTypeByID1.insert(pair<u32,string>(769,"adapter")); 
    return OMSSObjTypeByID1; 
}; 
map<u32,string> getOMSSObjTypeByID = create_OMSSObj_map(); 

template<typename TKey,typename TValue> 
class Node{ 
    map<TKey,TValue> objProperties; 
public: 
    Node(); 
    Node(const map<TKey,TValue>& m); 
    bool operator<(Node const& a2) const{ 
     Node const& a1 = *this; 
     map<TKey,TValue>::iterator it1=a1.objProperties.begin(); 
     map<TKey,TValue>::iterator it2=a2.objProperties.begin(); 
     while(it1!=a1.objProperties.end() && it2!=a2.objProperties.end()){ 
      if((*it1).second < (*it2).second) 
       return true; 
      else if((*it1).second > (*it2).second) 
       return false; 
      it1++; 
      it2++; 
     } 
    }; 
    map<TKey,TValue> getObjProperties(); 
    TValue getObjPropertyValue(TKey Key); 
    void setObjProperty(TKey key,TValue Value);/*Change Value of Key if Key is available, add new key-value pair otherwise*/ 
    u32 removeProperty(TKey Key); 
}; 

template<typename TKey,typename TValue> 
Node<TKey,TValue>::Node(const map<TKey,TValue>& m){ 
    objProperties = m; 
}; 

template<typename TKey,typename TValue> 
map<TKey,TValue> Node<TKey,TValue>::getObjProperties(){ 
    return objProperties; 
}; 
template<typename TKey,typename TValue> 
TValue Node<TKey,TValue>::getObjPropertyValue(TKey Key){ 
    /*if(objProperties.count(Key)>0) 
     return objProperties[Key]; 
    else 
     return TValue();*/ 
    return objProperties[Key];//This work same as above(if-else)? 
}; 
template<typename TKey,typename TValue> 
void Node<TKey,TValue>::setObjProperty(TKey Key,TValue Value){ 
    if(!objProperties.insert(pair<TKey,TValue>(Key,Value)).second){//Key already exist: so change the Value of corresponding Key 
     objProperties[Key] = Value; 
    } 
}; 
template<typename TKey,typename TValue> 
u32 Node<TKey,TValue>::removeProperty(TKey Key){ 
    return objProperties.erase(Key);//returns 1 if erased & 0 if Key not available 
}; 

template<typename TKey,typename TValue> 
class OMSSStorage{ 
    set<Node<TKey,TValue>> StorageTree; 
public: 
    u32 addNode(Node<TKey,TValue>); 
    u32 deleteNode(Node<TKey,TValue>); 
    u32 contains(Node<TKey,TValue>); 
    set<Node<TKey,TValue>> getStorageTree(); 
    u32 size(); 
}; 
template<typename TKey,typename TValue> 
u32 OMSSStorage<TKey,TValue>::addNode(Node<TKey,TValue> n){ 
    return StorageTree.insert(n).second; 
}; 
template<typename TKey,typename TValue> 
u32 OMSSStorage<TKey,TValue>::deleteNode(Node<TKey,TValue> n){ 
    return StorageTree.erase(n); 
}; 
template<typename TKey,typename TValue> 
u32 OMSSStorage<TKey,TValue>::contains(Node<TKey,TValue> n){ 
    return(StorageTree.find(n) != StorageTree.end()); 
}; 
template<typename TKey,typename TValue> 
set<Node<TKey,TValue>> OMSSStorage<TKey,TValue>::getStorageTree(){ 
    return(StorageTree); 
}; 
template<typename TKey,typename TValue> 
u32 OMSSStorage<TKey,TValue>::size(){ 
    return StorageTree.size(); 
}; 

template<typename TKey,typename TValue> 
void addDCStorageObject(OMSSStorage<TKey,TValue>,string,int); 
string getValueByName(string str,string name); 

template<typename TKey,typename TValue> 
void addDCStorageObject(OMSSStorage<TKey,TValue> tree,string StorObj,int propcount=2){ 
    if((int)NodeProps.size() < propcount) 
     return; 
    Node<string,string> n; 
    for(int i=0; i<propcount ; i++){ 
     n.setObjProperty(NodeProps[i],getValueByName(StorObj,NodeProps[i])); 
    } 
    return; 
}; 

string getValueByName(string obj,string name){ 
    int start,end; 
    string value,temp="<",temp1="</"; 
    temp.append(name); 
    temp1.append(name); 
    start=(int)obj.find(temp); 
    end=(int)obj.find(temp1); 
    value=obj.substr(start,end-start); 
    value=value.substr(value.find(">")+1,end-start); 
    return value; 
} 

int main(){ 
    OMSSStorage<string,string> StObj; 
    ifstream ifs("C:\\Users\\Public\\Documents\\share\\STORAGE.txt",ifstream::in); 
    string line; 
    string obj=""; 
    int start=0,end=0; 
    while (ifs.good()){ 
     getline(ifs,line); 
     if((line.find("<DCStorageObject>",0)) != string::npos && start==0){ 
      obj.clear(); 
      start=1; 
      end=0; 
      obj.append(line); 
      obj.append("\n"); 
     } 
     else if((line.find("</DCStorageObject>",0)) != string::npos && end==0){ 
      start=0; 
      end=1; 
      obj.append(line); 
     } 
     else{ 
      obj.append(line); 
      obj.append("\n"); 
     } 
     if(end==1){ 
      addDCStorageObject(StObj,obj,2); 
     } 
    } 
    set<Node<string,string>> o = StObj.getStorageTree(); 
    set<Node<string,string>>::iterator its=o.begin(); 
    while(its!=o.end()){ 
     cout<<"<StorageObj>:\n"; 
     map<string,string> m=(*its).getObjProperties(); 
     map<string,string>::iterator itm=m.begin(); 
     while(itm!=m.end()){ 
      cout<<(*itm).first<<" => "<<(*itm).second<<endl; 
     } 
    } 
    ifs.close(); 
    cin.get(); 
    return 0; 
} 

在編譯時,這是給連接錯誤。 我曾嘗試分離的類和方法,分別進入不同的頭文件,但還是我得到同樣的錯誤。 錯誤日誌附加爲圖像文件Linking Error

+0

我無法讀取錯誤消息。 – trojanfoe 2012-03-21 13:20:48

+0

請打開圖像轉換成新標籤/窗口.. – 2012-03-21 13:22:00

+0

呀好點:) – trojanfoe 2012-03-21 13:25:10

回答

3

您只需仔細閱讀錯誤消息以找到缺失函數的名稱(痛苦但肯定可行)。

在這種情況下,它是說有沒有Node::Node();定義 - 你聲明,但從未定義它。

編輯:我要補充一點,我幾乎沒有回答這個問題 - 這是需要切斷的問題倒在最低一段代碼,演示了此問題的一個近乎完美的例子(在這一點,你可能將不必再發布,因爲問題可能很明顯)。

+2

+1「(痛苦的,但當然是可能的)」,你讓我很快樂 – 2012-03-21 13:44:44

+0

非常感謝..定義節點(),解決了我的問題。 – 2012-03-21 15:06:38

相關問題