从'inherit class'无效初始化'template class'类型的引用

时间:2018-04-09 17:04:10

标签: c++ oop

我正在开发以下类,它继承了一个模板类。

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

你知道发生了什么吗?

由于

1 个答案:

答案 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的构造函数和析构函数声明为publicprotected。它们不能是private