c++ - 使用模板化接口(interface)导致 “Undefined reference to”

标签 c++ templates generics interface compiler-errors

所以我得到以下编译错误:

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 */

读写器.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; 
}

我明白,通过将实现保留在 header 中,我不应该出现 undefined reference 的错误。 更正了写入方法中的实现以适应接口(interface)。 仍然有编译错误。阅读链接。

最佳答案

请注意,您的实现提供了获取拷贝的void write(std::istringstream) 方法,而 undefined reference 用于获取类似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++ - 使用模板化接口(interface)导致 “Undefined reference to”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47954847/

相关文章:

java - Stream 在没有过滤器(谓词)的情况下工作,使用它给出 "Incompatible types"

c++ - 我需要一个具有多个值的键。你会推荐什么数据结构?

c++ - SDL2 IMG_Load 不工作

c++ - 如何使 '=' 重载在 '=' 的另一端工作

c++ - 是否可以在 O(1) 时间内为 C++ vector 分配新值?

c++ - C++可变参数模板中的编译器错误

c++ - 返回嵌套模板的模板方法的签名会产生编译错误

c++ - 非静态模板成员 : possible?

c# - 没有 lambda 表达式的 Entity Framework 查询

Java 泛型新原始类型与泛型类型