我是 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
结构实例化 FileWriter
和 NetWriter
类。因此,编译器尝试使用 FileWriterInfo
类型实例化 NetWriter::Write
函数,但我们收到错误。
您可以将Write
方法直接放置到FileWriterInfo
和NetWriterInfo
结构中(根据数据封装的原理)。它还可以简化代码。
关于c++ - C++ 模板的编译器错误表明这不是结构体的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72599825/