Home > database >  compiler error with C template says that is not the member of struct
compiler error with C template says that is not the member of struct

Time:06-13

I'm a newer of using C template and I got trouble with template compiling. I want to write a similar factory method with template but compiler error says that 'ip is not the member of _FileWriterInfo'. I was confused because it has be defined in NetWriterInfo struct but not in FileWriterInfo. And if I cancel the 'ip' member defination, compiler works. Apparently T param of NetWriter may infer to FileWriterInfo struct by mistake. How can I get rid of it? plz help.

#include <iostream>
#include <string>

enum WriterFormat
{
    WTYPE_FILE = 0,
    WTYPE_NET = 1
};

typedef struct _FileWriterInfo
{
    std::string name;
    std::string page;
}FileWriterInfo;

typedef struct _NetWriterInfo
{
    std::string name;
    std::string ip;
}NetWriterInfo;

template<typename T>
class Writer
{
public:
    virtual ~Writer() {}
    virtual std::string Write(T info) = 0;
};

template<typename T>
class FileWriter : public Writer<T>
{
public:
    std::string Write(T info) override {
        std::cout << "name:" << info.name << "\n";
        std::cout << "page:" << info.page << "\n";
        return info.name;
    }
};

template<typename T>
class NetWriter : public Writer<T>
{
public:
    std::string Write(T info) override {
        std::cout << "name:" << info.name << "\n";
        std::cout << "ip:" << info.ip << "\n";
        return info.name;
    }
};

class Creator
{
    Creator() {};
public:
    template<typename T>
    static Writer<T>* CreateWriter(WriterFormat fmt)
    {
        Writer<T>* p = nullptr;
        if (fmt == WTYPE_FILE)
            p = new FileWriter<T>;
        if (fmt == WTYPE_NET)
            p = new NetWriter<T>;
        return p;
    }
};

void WriteFile()
{
    FileWriterInfo info = { "Hello","100" };
    Writer<FileWriterInfo>* w = Creator::CreateWriter<FileWriterInfo>(WTYPE_FILE);
    w->Write(info);
    return;
}

int main()
{
    WriteFile();
    return 0;
}

CodePudding user response:

The CreateWriter function instantiates the FileWriter and NetWriter classes with the FileWriterInfo structure. Accordingly, the compiler tries to instantiate the NetWriter::Write function with the type FileWriterInfo, and we get an error.

You can place Write methods directly to FileWriterInfo and NetWriterInfo stuctures (according to the principle of data encapsulation). It also can simplify the code.

  • Related