模板接口的使用引起“未定义的引用”
Usage of templated interfaces cause “Undefined reference to”
,所以我会收到以下编译错误:
CMakeFiles/moje.dir/src/main/cpp/main.cpp.o:(.rodata._ZTV10ReadWriterINSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEENS0_19basic_istringstreamIcS3_S4_EEE[_ZTV10ReadWriterINSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEENS0_19basic_istringstreamIcS3_S4_EEE]+0x48): undefined reference to `Writer<std::__cxx11::basic_istringstream<char, std::char_traits<char>, std::allocator<char> > >::write(std::__cxx11::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >&)'
CMakeFiles/moje.dir/src/main/cpp/main.cpp.o:(.rodata._ZTV6WriterINSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEEE[_ZTV6WriterINSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEEE]+0x20): undefined reference to `Writer<std::__cxx11::basic_istringstream<char, std::char_traits<char>, std::allocator<char> > >::write(std::__cxx11::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >&)'
实现如下:
writer.h
#ifndef WRITER_H
#define WRITER_H
template<typename T>
class Writer {
public:
virtual ~Writer() {}
virtual void write(T &in);
};
#endif /* WRITER_H */
Reader.h
#ifndef READER_H
#define READER_H
template<typename T>
class Reader {
public:
virtual ~Reader() {}
virtual T read();
};
#endif /* READER_H */
readwriter.h
#ifndef READWRITER_H
#define READWRITER_H
#include "Reader.h"
#include "Writer.h"
template<typename R, typename W>
class ReadWriter : public Reader<R>, public Writer<W>{
public:
virtual ~ReadWriter() {}
};
#endif /* READWRITER_H */
piffimreadWriter.h
#ifndef CONFIGREADWRITER_H
#define CONFIGREADWRITER_H
#include "header/ReadWriter.h"
class ConfigReadWriter : public ReadWriter<std::ostringstream, std::istringstream> {
public:
ConfigReadWriter(Config &config) : config_(config) {}
~ConfigReadWriter() {}
std::ostringstream read() override {
std::ostringstream ss("ConfigReadWriter::read");
return ss;
};
void write(std::istringstream& in) override {
std::cout << "ConfigReadWriter::write" << std::endl;
}
private:
Config& config_;
};
#endif /* CONFIGREADWRITER_H */
main.cpp:
#include "header/config/Config.h"
#include "header/config/ConfigReadWriter.h"
int main() {
std::string a = "1";
Config config(1, a);
ConfigReadWriter rw(config);
return 0;
}
我理解,通过将实现保持在标题中,我不应出现未定义的参考。更正了写入方法中的实现以适合接口。仍然有编译错误。读取链接。
请注意,您的实现提供了 void write(std::istringstream)
方法,而未定义的参考是用于使用诸如void write(std::istringstream &)
之类的参考,而您未在基类virtual void write(T &in);
上实现的参考。因此,您应该使用正确的签名更新实现:
virtual void write(T &in) = 0; // no implementation
...
void write(std::istringstream &) override {
std::cout << "ConfigReadWriter::write" << std::endl;
}
override
指定符确保方法签名匹配基类中的虚拟方法签名。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用