使用模板实现接口的c++编译错误
c++ compiling error for interface implementation with template
我正在尝试为某些 class 实现带有模板的接口。我有这样的代码:
file.h
#pragma once;
class MySpecificClass {
std::string data;
unsigned int x;
unsigned int y;
unsigned int z;
public:
MySpecificClass(): data(""), x(0), y(0), z(0) {
}
MySpecificClass(std::string s, unsigned int xx, unsigned int yy, unsigned zz) : data(s), x(xx), y(yy), z(zz) {
}
};
template <class T>
class IFileClass {
public:
IFileClass(std::string f) : fileName(f) {
}
virtual void save(T c);
protected:
std::string fileName;
};
template <class T>
class FileWithClass : public IFileClass<T> {
public:
FileWithClass(std::string fn) : IFileClass<T>(fn) {
}
void save(T c) override {
std::cout << "FileWithClass save" << std::endl;
}
};
当我尝试在 main 中使用它时
main.cpp
#include "file.h"
int main() {
// create object to save
MySpecificClass msc = {"My Test", 100, 200, 300};
FileWithClass<MySpecificClass> fsv = {"test.txt"};
fsv.save(msc);
}
我得到这样的编译错误:
undefined reference to `IFileClass<MySpecificClass>::save(MySpecificClass)'
怎么了?
模板不是这里的问题。没有定义的虚函数是.
C++ 标准规定必须定义 class 的所有非纯虚方法。在您的基础 class 中,您声明了一个虚函数保存。如果它不是虚拟的,那么可以不定义它(如果不使用它 - 链接器不会抱怨)。
但由于它是虚拟的,因此有多种选择 - 使用 {} 给它一个空定义或使用 =0 使其成为纯虚拟。根据您的需要,两种变体都是合法的。
我正在尝试为某些 class 实现带有模板的接口。我有这样的代码:
file.h
#pragma once;
class MySpecificClass {
std::string data;
unsigned int x;
unsigned int y;
unsigned int z;
public:
MySpecificClass(): data(""), x(0), y(0), z(0) {
}
MySpecificClass(std::string s, unsigned int xx, unsigned int yy, unsigned zz) : data(s), x(xx), y(yy), z(zz) {
}
};
template <class T>
class IFileClass {
public:
IFileClass(std::string f) : fileName(f) {
}
virtual void save(T c);
protected:
std::string fileName;
};
template <class T>
class FileWithClass : public IFileClass<T> {
public:
FileWithClass(std::string fn) : IFileClass<T>(fn) {
}
void save(T c) override {
std::cout << "FileWithClass save" << std::endl;
}
};
当我尝试在 main 中使用它时
main.cpp
#include "file.h"
int main() {
// create object to save
MySpecificClass msc = {"My Test", 100, 200, 300};
FileWithClass<MySpecificClass> fsv = {"test.txt"};
fsv.save(msc);
}
我得到这样的编译错误:
undefined reference to `IFileClass<MySpecificClass>::save(MySpecificClass)'
怎么了?
模板不是这里的问题。没有定义的虚函数是.
C++ 标准规定必须定义 class 的所有非纯虚方法。在您的基础 class 中,您声明了一个虚函数保存。如果它不是虚拟的,那么可以不定义它(如果不使用它 - 链接器不会抱怨)。
但由于它是虚拟的,因此有多种选择 - 使用 {} 给它一个空定义或使用 =0 使其成为纯虚拟。根据您的需要,两种变体都是合法的。