фатальная ошибка LNK1120: 1 нерешенные внешние проблемы в c ++ - PullRequest
0 голосов
/ 21 марта 2012

Я написал код на 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;
}

При компиляции это приводит к ошибке компоновки. Я попытался разделить классы и соответствующие методы в разных заголовочных файлах, но все же я получаю ту же ошибку. Журнал ошибок прилагается в виде файла изображения Linking Error

1 Ответ

3 голосов
/ 21 марта 2012

Вам просто нужно внимательно прочитать сообщение об ошибке, чтобы найти имя отсутствующей функции (болезненно, но, безусловно, возможно).

В этом случае говорится, что нет определения Node::Node(); -Вы объявили это, но так и не определили.

Редактировать: я должен добавить, что я почти не ответил на это - это почти идеальный пример необходимости сократить вопрос до минимума фрагмент кода, который демонстрирует проблему (в этот момент вам, вероятно, не пришлось бы больше публиковать, потому что проблема, вероятно, была бы очевидна).

...