lundi 13 juin 2022

compiler error with C++ template says that is not the member of struct

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;
}

Aucun commentaire:

Enregistrer un commentaire