我正在开发以下类,它继承了一个模板类。
template<typename T>
class test : public T
{
public:
void init() {
T::init();
abc = true;
}
private:
bool abc;
}
在我的一个基类上,我有以下单例方法:
class foo : protected bar
{
public:
static foo &getInstance();
void init();
private:
foo();
foo(foo const&);
void operator=(foo const&);
~foo() {};
}
当我创建以下实例时:
test<foo> &instance = test<foo>::getInstance();
我收到错误:
invalid initialization of reference of type test<foo>& from expression of type foo
你知道发生了什么吗?
由于
答案 0 :(得分:1)
test<foo>::getInstance()
解析为foo::getInstance()
。该函数返回foo&
,而不是test<foo>&
。 foo&
无法转换为test<foo>&
。因此编译错误。
使用
foo& instance = test<foo>::getInstance();
如果您必须拥有test<foo>&
,则需要在getInstance()
中实施test
。
template<typename T>
class test : public T
{
public:
void init() {
T::init();
abc = true;
}
static test& getInstance()
{
static test instance;
return instance;
}
private:
bool abc;
};
但是,你必须要处理级联效应。您必须确保将foo
的构造函数和析构函数声明为public
或protected
。它们不能是private
。