【发布时间】:2017-12-23 18:14:22
【问题描述】:
所以我得到以下编译错误:
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> >&)'
实现如下:
作家.h
#ifndef WRITER_H
#define WRITER_H
template<typename T>
class Writer {
public:
virtual ~Writer() {}
virtual void write(T &in);
};
#endif /* WRITER_H */
阅读器.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 */
ConfigReadWriter.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;
}
我明白,通过将实现保留在标头中,我不应该出现未定义引用的错误。 更正了 write 方法中的实现以适应接口。 仍然有编译错误。阅读链接。
【问题讨论】:
-
同意确保您没有尝试在源文件中实现您的模板。
标签: c++ templates generics interface compiler-errors