对构造函数的未定义引用

问题描述 投票:-1回答:1

我正在尝试创建一种表,并管理我决定创建这些类的所有数据:

[Column.hTab.hDatabase.h,模板ColumnImpl.h和某些继承的类,例如IntColumn.hFloatColumn.h等]

class Column {
public:
    Column();
    virtual ~Column();
    virtual string getType() = 0;
};
template <typename T> class ColumnImpl : public Column {
public:
    ColumnImpl();
    ColumnImpl(const T& to_set);
    vector<T> const& getData() const { return _data; }
    void addElem(const T& elem_to_add);
    void operator=(const ColumnImpl& to_assign);
protected:
    vector<T> _data;
};
class Tab {
public:
    Tab();
    ~Tab();
    void addColumn(string name, string type);
    void addRecord(string column);
    void operator=(const Tab& to_assign);
private:
    map<string, shared_ptr<Column>> _columns;
    int _primary_key;
};
class Database {
public:
    Database();
    ~Database();
    void createNewTable(string name);
    void addColumnToTab(string tab_name, string col_name, string type);
private:
    map<string, Tab> _tables;
};

如果我尝试构建项目,则会收到错误:undefined reference to TimeColumn::TimeColumn(),并且对于所有其他派生类和Tab.h都是相同的。由于我以前从未与继承有关,而且我实际上也是stl的新手,所以我无法理解我要执行的操作是什么问题。

所有错误均参考以下代码行(我使用所有列类型进行此操作:]

_columns[name].reset(new IntColumn()); // This line it's inside a method where 'name' is a std::string

编辑:我添加了更多代码

void Database::createNewTable(string name) {
    _tables[name] = Tab();
}
void Database::addColumnToTab(string tab_name, string col_name, string type) {
    const auto & it_target_tab = _tables.find(tab_name);
    it_target_tab->second.addColumn(col_name, type);
}
void Tab::operator=(const Tab &to_assign) {
    _columns = to_assign._columns;
}

就是全部,其余各行是ColumnImpl.cpp中的方法,其中包含1个push_back或基本内容...

c++ oop stl new-operator undefined-reference
1个回答
0
投票

使用Apple clang版本11.0.0(clang-1100.0.33.8)编译时没有错误:

#include <vector>
#include <string.h>
#include <map>

using namespace std;

class Column {
public:
    Column(){}
    virtual ~Column(){}
    virtual string getType() = 0;
};

template <typename T> class ColumnImpl : public Column {
protected:
    vector<T> _data;
public:
    ColumnImpl():Column(){}
    ColumnImpl(const T& to_set){}
    vector<T> const& getData() const { return _data; }
    void addElem(const T& elem_to_add){}
    void operator=(const ColumnImpl& to_assign){}

};

class Tab {
public:
    Tab(){}
    ~Tab(){}
    void addColumn(string name, string type){}
    void addRecord(string column){}
    void operator=(const Tab& to_assign){}
private:
    map<string, shared_ptr<Column> > _columns;
    int _primary_key;
};

class Database {
public:
    Database(){}
    ~Database(){}
    void createNewTable(string name){
        _tables[name] = Tab();
    }
    void addColumnToTab(string tab_name, string col_name, string type){
        const auto & it_target_tab = _tables.find(tab_name);
        it_target_tab->second.addColumn(col_name, type);
    }
private:
    map<string, Tab> _tables;
};

只需执行所有主体。

© www.soinside.com 2019 - 2024. All rights reserved.