我是使用 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;
}
uj5u.com熱心網友回復:
該CreateWriter函式用結構實體化FileWriter和NetWriter類FileWriterInfo。因此,編譯器嘗試NetWriter::Write用 type 實體化函式FileWriterInfo,我們得到一個錯誤。
您可以將Write方法直接放置到FileWriterInfo和NetWriterInfo結構中(根據資料封裝的原則)。它還可以簡化代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490205.html
