具有纯虚函数的模板 class 的 C++ 语法?
C++ syntax of template class with pure virtual function?
我对 C++ 模板只有一知半解,在模板中添加纯虚函数class已经用尽了我的能力来满足编译器。
下面的代码...
#include <iostream>
#include <string>
#include <sstream>
class Pearl
{
public:
Pearl(int value);
virtual ~Pearl();
protected:
int mValue;
};
Pearl::Pearl(int value)
: mValue(value)
{
std::cout << "$" << mValue << " Pearl created" << std::endl;
}
Pearl::~Pearl()
{
std::cout << "$" << mValue << " Pearl destroyed" << std::endl;
}
///////////////////////////////////////////////////////////////////////
class Oyster
{
public:
Oyster(std::string str, int value);
virtual ~Oyster();
protected:
Pearl mPearl;
std::string mName;
friend class OStreamer;
};
Oyster::Oyster(std::string name, int value)
: mName(name)
, mPearl(value)
{
std::cout << "Oyster " << mName << " created" << std::endl;
}
Oyster::~Oyster()
{
std::cout << "Oyster " << mName << " destroyed" << std::endl;
}
///////////////////////////////////////////////////////////////////////
template <typename T> class Streamer
{
public:
Streamer(T& rT, unsigned int flags);
~Streamer();
virtual std::ostream Display() = 0;
static const unsigned int A = 0x1;
static const unsigned int B = 0x2;
protected:
T& mrT; // Aah pity the foo!
unsigned int mFlags;
friend class OStreamer;
};
///////////////////////////////////////////////////////////////////////
class OStreamer : public Streamer<Oyster>
{
public:
OStreamer(Oyster oyster, unsigned int flags);
virtual std::ostream Display();
};
OStreamer::OStreamer(Oyster oyster, unsigned int flags)
: Streamer<Oyster>(oyster, flags)
{
}
std::ostream OStreamer::Display()
{
std::ostringstream oss;
oss << "Oyster[" << mrT.mName << "]" << std::endl;
}
///////////////////////////////////////////////////////////////////////
template <typename T> std::ostream& operator<<(std::ostream& os, const Streamer<T> streamer)
{
return os;
}
///////////////////////////////////////////////////////////////////////
int main()
{
Oyster sam("Sam", 50);
std::cout << OStreamer(sam, OStreamer::A) << std::endl;
return 0;
}
...生成以下编译器错误(使用 g++ 4.4.7):
>g++ main.cpp
main.cpp: In function ‘int main()’:
main.cpp:107: error: cannot allocate an object of abstract type ‘Streamer<Oyster>’
main.cpp:56: note: because the following virtual functions are pure within ‘Streamer<Oyster>’:
main.cpp:61: note: std::ostream Streamer<T>::Display() [with T = Oyster]
有人能帮我理解为什么编译器不接受 OStreamer::Display() 的实现作为对 Streamer::Display() 的必需覆盖吗?
作为上下文:这是实验性的、人为设计的代码,让我自己熟悉将模板 classes 与纯虚函数结合起来。我想用这段代码完成的是为调用 OStreamer::Display 的 OStreamer 对象实现一个 otream 运算符。我认识到 ostream 运算符可能需要一些调整,但我 认为 这不是问题所在。
将您的运算符重载更改为:
template <typename T> std::ostream& operator<<(std::ostream& os,
const Streamer<T> &streamer)
{
return os;
}
传递const Streamer<t>
的参数需要复制基class,当然做不到,因为它是虚拟的
传递引用可以避免这个问题。
我对 C++ 模板只有一知半解,在模板中添加纯虚函数class已经用尽了我的能力来满足编译器。
下面的代码...
#include <iostream>
#include <string>
#include <sstream>
class Pearl
{
public:
Pearl(int value);
virtual ~Pearl();
protected:
int mValue;
};
Pearl::Pearl(int value)
: mValue(value)
{
std::cout << "$" << mValue << " Pearl created" << std::endl;
}
Pearl::~Pearl()
{
std::cout << "$" << mValue << " Pearl destroyed" << std::endl;
}
///////////////////////////////////////////////////////////////////////
class Oyster
{
public:
Oyster(std::string str, int value);
virtual ~Oyster();
protected:
Pearl mPearl;
std::string mName;
friend class OStreamer;
};
Oyster::Oyster(std::string name, int value)
: mName(name)
, mPearl(value)
{
std::cout << "Oyster " << mName << " created" << std::endl;
}
Oyster::~Oyster()
{
std::cout << "Oyster " << mName << " destroyed" << std::endl;
}
///////////////////////////////////////////////////////////////////////
template <typename T> class Streamer
{
public:
Streamer(T& rT, unsigned int flags);
~Streamer();
virtual std::ostream Display() = 0;
static const unsigned int A = 0x1;
static const unsigned int B = 0x2;
protected:
T& mrT; // Aah pity the foo!
unsigned int mFlags;
friend class OStreamer;
};
///////////////////////////////////////////////////////////////////////
class OStreamer : public Streamer<Oyster>
{
public:
OStreamer(Oyster oyster, unsigned int flags);
virtual std::ostream Display();
};
OStreamer::OStreamer(Oyster oyster, unsigned int flags)
: Streamer<Oyster>(oyster, flags)
{
}
std::ostream OStreamer::Display()
{
std::ostringstream oss;
oss << "Oyster[" << mrT.mName << "]" << std::endl;
}
///////////////////////////////////////////////////////////////////////
template <typename T> std::ostream& operator<<(std::ostream& os, const Streamer<T> streamer)
{
return os;
}
///////////////////////////////////////////////////////////////////////
int main()
{
Oyster sam("Sam", 50);
std::cout << OStreamer(sam, OStreamer::A) << std::endl;
return 0;
}
...生成以下编译器错误(使用 g++ 4.4.7):
>g++ main.cpp
main.cpp: In function ‘int main()’:
main.cpp:107: error: cannot allocate an object of abstract type ‘Streamer<Oyster>’
main.cpp:56: note: because the following virtual functions are pure within ‘Streamer<Oyster>’:
main.cpp:61: note: std::ostream Streamer<T>::Display() [with T = Oyster]
有人能帮我理解为什么编译器不接受 OStreamer::Display() 的实现作为对 Streamer::Display() 的必需覆盖吗?
作为上下文:这是实验性的、人为设计的代码,让我自己熟悉将模板 classes 与纯虚函数结合起来。我想用这段代码完成的是为调用 OStreamer::Display 的 OStreamer 对象实现一个 otream 运算符。我认识到 ostream 运算符可能需要一些调整,但我 认为 这不是问题所在。
将您的运算符重载更改为:
template <typename T> std::ostream& operator<<(std::ostream& os,
const Streamer<T> &streamer)
{
return os;
}
传递const Streamer<t>
的参数需要复制基class,当然做不到,因为它是虚拟的
传递引用可以避免这个问题。