c++ - C++ 模板的编译器错误表明这不是结构体的成员

标签 c++ c++11 templates compiler-errors factory

我是 C++ 模板的新手,我在模板编译方面遇到了麻烦。 我想用模板编写一个类似的工厂方法,但编译器错误说'ip is not the member of _FileWriterInfo'。我很困惑,因为它已在 NetWriterInfo 结构中定义,但在 FileWriterInfo 中没有定义。如果我取消“ip”成员定义,编译器就会工作。显然 NetWriter 的 T 参数可能会错误地推断出 FileWriterInfo 结构。我怎样才能摆脱它?请帮忙。

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

最佳答案

CreateWriter 函数使用 FileWriterInfo 结构实例化 FileWriterNetWriter 类。因此,编译器尝试使用 FileWriterInfo 类型实例化 NetWriter::Write 函数,但我们收到错误。

您可以将Write方法直接放置到FileWriterInfoNetWriterInfo结构中(根据数据封装的原理)。它还可以简化代码。

关于c++ - C++ 模板的编译器错误表明这不是结构体的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72599825/

相关文章:

C++:如何从 cin 中删除错误的输入?

c++ - 类声明的编译错误 "looks like a function definition"是什么意思?

c++ - std::promise 通知多个客户端

templates - 期望无限递归模板实例化?

C++ 避免 vector <bool>实例化

c++ - 在 qopenglfunctions.h 中找不到 glGenBuffers、glBindBuffer 等

c++ - Xcode中c++结构的内存布局不一致

c++ - 我可以有一个 lambda 的 boost 无锁队列吗?

c++ - 如果 unique_ptr 需要存储删除器,它怎么能没有开销?

类似类的 C++ 类模板