c++ - 多个错误未定义对方法的引用

标签 c++

我有这样的头文件声明

#ifndef CONTAINER_H
#define CONTAINER_H

#include <map>
#include "object.h"

namespace memory {

template<class T>
class Collector {
};

template <class T>
class Collector<T*> {

private:
    std::map<std::string, T*> mem_storage;
public:
    std::string put_object(T* to_store);
    T* get_object(std::string key);
    void list_objects();
    void clean_up();
    void clean_object(std::string key); // force cleaning
    void mark_object_to_remove(std::string key); // mark unused
    void clean_removable(); // move to scheduled task

    ~Collector() {};
};

}

#endif

这样的实现

#include "../headers/container.h"

#define null nullptr

#include <iostream>
#include <string>

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

using namespace memory;

template<typename T>
void Collector<T*>::clean_object(std::string key) {
    int removed = mem_storage.erase(key);
    std::string removed_string = boost::lexical_cast<std::string>(removed);
}

template<typename T>
void Collector<T*>::clean_up() {
    mem_storage.clear();
}

template<typename T>
T* Collector<T*>::get_object(std::string key) {
    typename std::map<std::string, T*>::iterator it = mem_storage.find(key);
    if (it != mem_storage.end()) {
        return it->second;
    } else {
        return null;
    }
}

template<typename T>
void Collector<T*>::list_objects() {
    for (typename std::map<std::string, T*>::iterator it = mem_storage.begin(); it != mem_storage.end(); ++it) {
        std::cout << it->first << " => " << it->second->to_string() << std::endl;
    }
}

template<typename T>
std::string Collector<T*>::put_object(T* to_store) {
    boost::uuids::uuid uuid = boost::uuids::random_generator()();
    std::string key = boost::uuids::to_string(uuid);
    mem_storage[key] = to_store;
    return key;
}

template<typename T>
void Collector<T*>::mark_object_to_remove(std::string key) {
    mem_storage.find(key)->second->removable = true;
}

template<typename T>
void Collector<T*>::clean_removable() {
    typename std::map<std::string, T*>::iterator it = mem_storage.begin();
    while (it != mem_storage.end()) {
        std::string id = it->first;
        T instance = it->second;
        if (instance->removable) {
            mem_storage.erase(it++);
        } else {
            ++it;
        }
    }
}

我的主文件是这样的

#include <iostream>

#define byte unsigned char
#define null nullptr

#include "base/headers/object.h"
#include "base/headers/indexed_object.h"
#include "base/headers/container.h"
#include "base/headers/reflector.h"

void garbage_collection_prototype_example() {
    core::Object *io = runtime::RuntimeReflector::create_instance(
        "core::IndexedObject");
    core::Object *io_new = runtime::RuntimeReflector::create_instance("core::IndexedObject");
    std::cout << "Class 1 name: [" + io->get_class_name() + "]" << std::endl;
    std::cout << "Class 2 name: [" + io_new->get_class_name() + "]" << std::endl;

    bool is_same = io_new->is_same_instance(io);
    std::cout << "Is same: " << std::boolalpha << is_same << std::endl;

    memory::Collector<core::Object*> *garbage_collector = new memory::Collector<core::Object*>();
    std::string key = garbage_collector->put_object(io);
    std::string key_new = garbage_collector->put_object(io_new);
    garbage_collector->list_objects();

    garbage_collector->mark_object_to_remove(key);
    garbage_collector->clean_removable();

    garbage_collector->list_objects();

    garbage_collector->clean_up();
}

int main(int argc, char *argv[]) {
    garbage_collection_prototype_example();
    return 0;
}

但是当我尝试构建项目时出现了一堆错误

D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:22: undefined reference to `memory::Collector<core::Object*>::put_object(core::Object*)'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:23: undefined reference to `memory::Collector<core::Object*>::put_object(core::Object*)'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:24: undefined reference to `memory::Collector<core::Object*>::list_objects()'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:26: undefined reference to `memory::Collector<core::Object*>::mark_object_to_remove(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:27: undefined reference to `memory::Collector<core::Object*>::clean_removable()'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:29: undefined reference to `memory::Collector<core::Object*>::list_objects()'
D:\c++\eclipse_workspace\SDLAttempts\Debug/../src/main.cpp:31: undefined reference to `memory::Collector<core::Object*>::clean_up()'

就好像它看不到Collector的任何方法。 可能是因为我对基本非专业类 Collector 的空声明?但是我尝试在其中添加方法的实现,但没有帮助。

最佳答案

简答

函数模板的定义(实现)不能放在.cpp文件中。将它们放入声明它们的同一 header 中。

解释

这是因为函数模板在使用时(在何处)被实例化,因此编译器需要在使用它们的任何地方查看它们是如何定义的。有一些解决方法可以将定义与函数/类模板的声明分开,但所有这些都意味着将模板的定义包含在使用它的翻译单元中。

关于c++ - 多个错误未定义对方法的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31534476/

相关文章:

c++ - 为什么将智能指针重新分配给自身会导致破坏?

c++ - 查找 C++ 源文件的符号

python - 编译 swig 输出时找不到 arrayobject.h

C++ for-range 循环

c++ - 为什么 std::distance 打印出 `-` ?

c++ - 在 CUDA 中求解稀疏正定线性系统

c++ - 反复调用 std::future::get

c++ - 计算以下算法的复杂性?

c++ - 在执行期间将大型多维数组读取和写入二进制文件并返回数组?

c++ - linux 上的运算符 new 和 bad_alloc