我正在测试我对C ++中泛型的知识。虽然我正在掌握它,但我仍然需要收紧一些关于这个主题的知识。目前,我在使用模板化类构造函数时遇到了问题。我收到了未定义的引用错误。因为我知道编译器需要访问整个模板定义才能为模板的每个实例化编译代码,所以我将构造函数的定义保存在.h文件中,如下所示:
#ifndef CLASS1_H
#define CLASS1_H
#include <vector>
#include <string>
using namespace std;
template <class T, int N>
class Class1{
public:
Class1(string inName, int capacity);
private:
string m_name;
int m_capacity;
};
template <class T, int N>
Class1<T, N>::Class1(string inName, int capacity) {
m_name = inName;
m_capacity = capacity;
}
#endif
据我所知,这是我正确宣布的。下面的类Class2.cpp在它的构造函数参数中使用了Class1中的构造函数:
#include "Class2.h"
using namespace std;
Class2::Class2(vector< Class1 <ClassPI, 3141> > ident) {
m_ident = ident;
}
我尝试声明&#34;模板类Class1&lt; ClassPI,3141&gt; underCode&#34;在&#34; Class2.cpp&#34;的底部但它没有工作(因为我已经实现了Class2构造函数(?))。这是Class2的头文件:
#ifndef CLASS2_H
#define CLASS2_H
#include "Class1.h"
#include "ClassPI.h"
class Class2 {
public:
Class2(vector< Class1<ClassPI, 3141> > ident);
private:
vector< Class1<ClassPI, 3141> > m_ident;
};
#endif
最后,这是主要的课程:
#include "Class2.h"
#include "Class1.h"
#include "ClassPI.h"
#include <vector>
using namespace std;
int main() {
vector< Class1<ClassPI, 159> > vect;
Class2 class2 ( vect );
}
编译代码时出现以下错误消息:
main.cpp: In function ‘int main()’:
main.cpp:12: error: no matching function for call to
‘Class2::Class2(std::vector<Class1<ClassPI, 234>, std::allocator<Class1<ClassPI, 234> > >&)’
Class2.h:9: note: candidates are: Class2::Class2(std::vector<Class1<ClassPI, 3141>, std::allocator<Class1<ClassPI, 3141> > >)
Class2.h:7: note: Class2::Class2(const Class2&)
make: *** [main] Error 1
我已经完成了如上所示的构造函数定义。这是我认为我收到此错误消息的唯一原因,但显然这不是正确的原因。我还缺少什么?
P.S .: ClassPI.h:
#ifndef CLASSPI_H
#define CLASSPI_H
#include "ClassPI.h"
using namespace std;
class ClassPI
{
public:
ClassPI();
};
#endif
ClassPI.cpp:
#include"ClassPI.h"
using namespace std;
ClassPI::ClassPI(){}
Class3.h
#ifndef CLASS3_H
#define CLASS3_H
using namespace std;
template <class T, int N>
class Class3 {
public:
Class3();
};
答案 0 :(得分:0)
问题是我在主文件中将const参数从原始值(3141)更改为159。所以我回去把它改成了:
vector< Class1<ClassPI, 3141> > vect;
代码运行并编译成功。