c++ - 从模板类继承时出现 C++ 链接器错误
问题描述
编译我的代码时(稍后您会看到为什么这么大而不是MRE片段)
template<typename Elem>
class base_stream
{
protected:
array_list<Elem>* buffer_ = nullptr; // array_list is my class, it works
public:
virtual void open() = 0;
virtual void close() = 0;
};
template<typename Elem>
class base_input_stream : public base_stream<Elem>
{
public:
void open() override
{
this->buffer_ = new array_list<Elem>;
}
void close() override
{
this->buffer_ = nullptr;
}
Elem* read_until(Elem terminator)
{
Elem e;
while((e = read()) != terminator) this->buffer_->add(e);
return this->buffer_->as_array();
}
virtual Elem read();
};
class input_stream : public base_input_stream<char>
{
private:
FILE* file_;
public:
input_stream(FILE* f)
{
file(f);
open();
}
input_stream() { open(); }
~input_stream()
{
close();
delete buffer_;
}
char* read_line()
{
return this->read_until('\n');
// the problem is here, when I remove read_line, everything works.
}
char read() override
{
return fgetc(file_);
}
void file(FILE* f)
{
file_ = f;
}
};
和cpp文件
msl::input_stream is(stdin);
msl::stdos.write("Hello, ");
msl::stdos.write(is.read_line());
(请不要因为我在做什么而评判我……)
出现此错误:
Undefined symbols for architecture x86_64:
"msl::base_input_stream<char>::read()", referenced from:
vtable for msl::base_input_stream<char> in msl-test-9638bd.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是(奇怪的是)这有效:
#include <iostream>
template<typename E>
class X
{
};
template<typename E>
class Y : public X<E>
{
public:
void doStuff(E foo)
{
std::cout << foo << std::endl;
}
};
class Z : public Y<char>
{
public:
void hmm() {
doStuff('h');
// or Y<char>::doStuff('h');
// or this->doStuff('h');
}
};
Z hmm = Z();
并编译没有任何错误。(输出如预期h
)
这里有什么问题。该错误很奇怪,因为其他方法有效,但仅read_line
无效
解决方案
推荐阅读
- docker - Kubernetes 和 Docker 支持
- git - 创建发布子分支
- http - REST API 在反向代理后面生成绝对 URL
- github - 使用 GitHub 或 GitLab 进行 CI/CD 有什么区别?
- compiler-construction - llvm-c/Types.h:没有这样的文件或目录
- laravel - 如何在 Vue.js 和 Laravel 8 中使用基于 Axios Promise 的 Http Request 获取特定的列名值
- javascript - JavaScript removeAttribute("readonly") 不起作用
- tensorflow - 修改 Keras ImageDataGenerator 和 flow_from_directory 的类名部分
- java - 单击搜索按钮后无法刷新更新的数据(通过 API 获取数据)
- camelcasing - SQL 工作台和 WbExport