Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化接口的使用导致“;未定义对”;_C++_Templates_Generics_Interface_Compiler Errors - Fatal编程技术网

C++ 模板化接口的使用导致“;未定义对”;

C++ 模板化接口的使用导致“;未定义对”;,c++,templates,generics,interface,compiler-errors,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_traitsIcE

因此,我得到了以下编译错误:

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> >&)'
我理解,通过将实现保持在标题中,我不应该在引用未定义的情况下发生错误。 已更正写入方法中的实现,以适合接口。
仍然有编译错误。阅读链接。

请注意,您的实现提供了
void write(std::istringstream)
方法进行复制,而未定义的引用则用于方法进行引用,如
void write(std::istringstream&)
,您没有在基类
虚拟void write(T&in)上实现该方法。因此,您应该使用正确的签名更新实现:

virtual void write(T &in) = 0; // no implementation

void write(std::istringstream&)重写{

std::无法复制约定的模板。请确保您没有尝试在源文件中实现模板。我将对我的代码库使用特定的重写宏,但对于代码段代码,我使用了w/o。Thx解决了该引用错误,但代码仍然无法编译(更新的失败编译信息)阅读链接:)好的,一切正常,它需要纯虚拟功能,除了输入错误和参考。
#ifndef READER_H
#define READER_H

template<typename T>
class Reader {
public:
    virtual ~Reader() {}
    virtual T read();
};
#endif /* READER_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 */
#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 */
#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; 
}
virtual void write(T &in) = 0; // no implementation
void write(std::istringstream &) override    {
    std::cout << "ConfigReadWriter::write" << std::endl;
}