从不同模块调用函数 - 引用错误

Calling function from different module - reference error

本文关键字:引用 错误 函数 调用 模块      更新时间:2023-10-16

我有以下程序。它是面向对象的,有一个结构"数组"(我必须使用我定义的结构,所以vector.h不算在内),我在其中存储一些对象。类函数和结构在 M.cpp(main)中工作得很好,但是当我尝试从控制器调用它们时.cpp我收到引用错误。

ListStruct.h:

template <class T>
struct Array{
    int days;
    T * M;
    Array( int size ) : days(size), M(new T[size])
    {
    }
    ~Array()
    {
       delete[] M;
    }
};
void currentDay();
template <class T>
void add(int,int,Array<T> &);
template <class T>
void dummyData(Array<T> &);

列表结构.cpp

#include <stdlib.h>
#include <iostream>
#include <ctime>
#include "ListStruc.h"
#include "Expe.h"
using namespace std;
int currDay;
void currentDay(){
    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
    ::currDay = now->tm_mon + 1;
}
void add(int cant, int type,Array <Expe> &A){
    //Adds to current day the amount to a specific type
    int newVal;
    newVal = A.M[currDay].getObj(type);
    newVal += cant;
    A.M[currDay].editObj(type,newVal);
}
void dummyData(Array <Expe> &A){
    for(int i=0; i<31; i++){
        A.M[i].Expe::setObj((i*3),(i*1),(i*6),(i*2),(i*4),(i*5));
    }
}

M.cpp - 程序的主要功能:

#include <iostream>
#include "Expe.h"
#include "ListStruc.h"
#include "Controller.h"
using namespace std;
int main(){
//Main function of the program. no pre/ post condition.
Array <Expe> A(31);   // Work space
Array <Expe> B(31);   // Backup space
cout<<&A; // testing for allocation
cout<<&B;
Expe a;
a.setObj(5,5,5,5,5,5); // checking class functions
a.printObj();
A.M[1]=a;
A.M[1].printObj();
//check dummy FOR-, WORKS!
for(int i=0; i<31; i++){
    A.M[i].Expe::setObj((i*3),(i*1),(i*6),(i*2),(i*4),(i*5));
}
a.editObj(3,100);
a.printObj();        // check objects calling, WORKS!
cout<<"Obj A.[10]:";
A.M[10].printObj();
cout<<endl<<"Obj A.[29]:";
A.M[29].printObj();
    dummyData(A);  ///////ERROR/////////

错误:

D:c++BeginLab3-5_OOPDebug/../M.cpp:44: undefined reference to `void dummyData<Expe>(Array<Expe>&)'

尝试了我能想到的一切...上网,仍然找不到该参考错误的原因。

您声明函数模板adddummyData,但定义非模板。

如果只需要这些函数来处理Array<Expe>而不是泛型数组,则将声明更改为非模板:

class Expe;
void add(int,int,Array<Expe> &);
void dummyData(Array<Expe> &);

如果它们需要泛型,则必须将定义移动到头文件中;模板通常需要定义在使用它们的每个源文件中可用。但是,您的函数似乎专门用于Expe,因此我认为它们不想成为模板。

此外,您的Array类型违反了三法则,使用起来非常危险。为什么不使用std::vector来安全地管理动态数组?

更新:你说你想看看如何在保持模板的同时做到这一点。为此,您需要对Expe进行明确的专业化。那看起来像这样:

template <> void dummyData(Array<Expe> &) {
    // your Expe version goes here
}

我不是 100% 确定您是否还需要在头文件中声明专用化;我已经很久没有做过这么奇怪的事情了,所以我不太确定细节。当然,如果您实现通用版本,那么您将不得不声明此专业化;否则,将改为选择通用版本。无论如何,将函数重载Array<Expe>更简单。

看起来您在ListStruct中提供的虚拟数据版本.cpp不被视为模板化版本的完全专用化。因此,编译器无法找到它。您应该将其定义为 template<> void dummyData<Expe>(Array<Expe>&)