C++ - 对最近创建的类的未定义引用!

Amo*_*tir 0 c++ codeblocks undefined-reference

我刚刚创建了这个新类:

//------------------------------------------------------------------------------
#ifndef MULTITHREADEDVECTOR_H
#define MULTITHREADEDVECTOR_H
//------------------------------------------------------------------------------
#include <vector>
#include <GL/GLFW.h>
//------------------------------------------------------------------------------
template<class T>
class MultithreadedVector {

    public:

        MultithreadedVector();

        void push_back(T data);

        void erase(typename std::vector<T>::iterator it);

        std::vector<T> get_container();
    private:

        std::vector<T> container_;
        GLFWmutex th_mutex_;


};
//------------------------------------------------------------------------------
#endif // MULTITHREADEDVECTOR_H_INCLUDED
//------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

类的定义:

//------------------------------------------------------------------------------
#include "MultithreadedVector.h"
//------------------------------------------------------------------------------
using namespace std;
//------------------------------------------------------------------------------
template<class T>
MultithreadedVector<T>::MultithreadedVector() {

    th_mutex_ = glfwCreateMutex();
}

template<class T>
void MultithreadedVector<T>::push_back(T data) {

    glfwLockMutex(th_mutex_);
    container_.push_back(data);
    glfwUnlockMutex(th_mutex_);

}

template<class T>
void MultithreadedVector<T>::erase(typename vector<T>::iterator it) {

    glfwLockMutex(th_mutex_);
    container_.erase(it);
    glfwUnlockMutex(th_mutex_);
}

template<class T>
vector<T> MultithreadedVector<T>::get_container() {


    return container_;

}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我尝试在我的代码中使用它作为另一个类的静态成员时:

// VehicleManager.h
#ifndef MULTITHREADEDVECTOR_H
#define MULTITHREADEDVECTOR_H

#include "MultithreadedVector.h"
#include "Vehicle.h"
class Foo {

   public:
     // stuffs
   private:
     static MultithreadedVector<Vehicle> vehicles_; 
     ...
}

#endif
Run Code Online (Sandbox Code Playgroud)

然后在里面:VehicleManager.cpp

#include "VehicleManager.h"

MultithreadedVector<Vehicle> VehicleManager::vehicles_;

void VehicleManager::Method() {

  Vehicle vehicle;
  VehicleManager::vehicles_.push_back(vehicle);

}
Run Code Online (Sandbox Code Playgroud)

但它不编译:(,我每次都得到这个错误消息:

C:\***\VehicleManager.cpp|188|undefined reference to `MultithreadedVector<Vehicle>::push_back(Vehicle)'|
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么,特别是我已经在VehicleManager.cpp的全局范围内定义了静态类成员.

PS:我正在使用Code :: Blocks.

谢谢 !

Joh*_*ell 5

盲目地将类模板实现移动到cpp文件时会发生这种情况.

要完成这项工作,您必须确切知道将要实例化类模板的T类型,并在cpp文件中指定它们.

在这种情况下,将其放在cpp文件中:

template class MultithreadedVector<Vehicle>;
Run Code Online (Sandbox Code Playgroud)

请注意,cpp文件必须知道Vehicle.

  • 当你知道_exactly_将用于实例化类模板的所有可能类型时,它可以是特殊情况下的好习惯.但是,在一般情况下,您需要将其保存在h文件中,例如,如果您提供SDK并且无法完全预测所有用例. (2认同)