简体   繁体   中英

fatal error LNK1120: 1 unresolved externals in c++

I have written a code in c++:

#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;
}

On compilation, this is giving linking error. I have tried separating classes and respective methods into different header files, but still I'm getting same error. The Error log is attached as an image file 链接错误

You just need to read through the error message carefully to find the name of the missing function (painful, but certainly possible).

In this case, it's saying there's no definition of Node::Node(); -- you declared it, but never defined it.

Edit: I should add that I almost didn't answer this -- it's a nearly perfect example of needing to cut the question down to the minimum piece of code that demonstrates the problem (at which point, you probably wouldn't have had to post any more, because the problem would probably have been obvious).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM