2012-03-21 72 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

相关问题