Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;抽象基模板类非Void方法_C++_Templates_Pure Virtual - Fatal编程技术网

C++ C++;抽象基模板类非Void方法

C++ C++;抽象基模板类非Void方法,c++,templates,pure-virtual,C++,Templates,Pure Virtual,我有一个抽象的基本模板类,它包含members函数,有些是void函数,有些返回从原始数据类型到模板参数数据类型的数据类型。我对C++仍然是新的,我知道,我不必在基类中实现纯虚函数,除非我希望在派生类中调用它们。对于没有返回值的成员函数,这个想法很好。对于返回整数的函数,我返回了0。但是当我找到一个返回对T(模板参数)的引用的函数时,我不知道该怎么办。我尝试了以下两种方法 template <typename T> T& AbstractBaseClass<T>:

我有一个抽象的基本模板类,它包含members函数,有些是void函数,有些返回从原始数据类型到模板参数数据类型的数据类型。我对C++仍然是新的,我知道,我不必在基类中实现纯虚函数,除非我希望在派生类中调用它们。对于没有返回值的成员函数,这个想法很好。对于返回整数的函数,我返回了0。但是当我找到一个返回对T(模板参数)的引用的函数时,我不知道该怎么办。我尝试了以下两种方法

template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}
模板
T&AbstractBaseClass::function(){
返回T();
}

模板
T&AbstractBaseClass::function(){
返回T&tmp=T();
}
但是这两种方法都不起作用,我不能定义这些函数,因为我得到了一个未定义的函数引用错误。我假设这个错误是因为函数是模板。实现非void纯虚函数的合适方法是什么

template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}

template <typename T>
T& AbstractBaseClass<T>::function(){
    //what must I do here when I don't have any member variable
}
模板
类AbstractBaseClass{
公众:
virtual~AbstractBaseClass()=0;
T&函数();
}
模板
T&AbstractBaseClass::function(){
//当我没有任何成员变量时,我必须在这里做什么
}

下面是一个纯虚函数和实现它的派生类的示例(为了清楚起见,省略了一些成员函数):

模板
阶级基础
{
公众:
虚拟T&get()=0;
virtual~Base()=0;
};
模板
Base::~Base(){}
模板
派生类:公共基
{
T;
公众:
T&get()重写{return T;}
};
请注意
Base
中的
get()
如何没有实现,而
Derived
中的
get
的实现使用了
Base
中不可用的新数据成员


还要注意的是,与其他纯虚拟函数不同,必须有一个实现。如果类中还有其他纯函数,通常不需要纯虚析构函数。此处所示为示例。

这里是纯虚拟函数和实现它的派生类的示例(为了清楚起见,省略了一些成员函数):

模板
阶级基础
{
公众:
虚拟T&get()=0;
virtual~Base()=0;
};
模板
Base::~Base(){}
模板
派生类:公共基
{
T;
公众:
T&get()重写{return T;}
};
请注意
Base
中的
get()
如何没有实现,而
Derived
中的
get
的实现使用了
Base
中不可用的新数据成员


还要注意的是,与其他纯虚拟函数不同,必须有一个实现。如果类中还有其他纯函数,通常不需要纯虚析构函数。此处所示为示例。

问题在于您试图返回对临时对象的引用。想一想当临时对象被销毁(立即销毁)时会发生什么,引用将引用什么?抽象基类可能没有成员变量,但您的具体派生类肯定需要一个成员变量。@Someprogrammerdude因此,源文件中的函数头应该是“virtual T&AbstractBaseClass::function()=0”?我无法执行此操作,因为我收到一个错误,提示“模板可能不是‘虚拟的’”。答案是“当我没有任何成员变量时,我必须在此处执行什么操作?”“返回的是局部静态变量,返回的是全局变量,或者基本上,你不能。阅读右值、左值、临时值和引用。删除整个
模板T&AbstractBaseClass::function(){}
部分,您不需要它。问题是您试图返回对临时对象的引用。想一想当临时对象被销毁(立即销毁)时会发生什么,引用将引用什么?抽象基类可能没有成员变量,但您的具体派生类肯定需要一个成员变量。@Someprogrammerdude因此,源文件中的函数头应该是“virtual T&AbstractBaseClass::function()=0”?我无法执行此操作,因为我收到一个错误,提示“模板可能不是‘虚拟的’”。答案是“当我没有任何成员变量时,我必须在此处执行什么操作?”“返回的是局部静态变量,返回的是全局变量,或者基本上,你不能。阅读右值、左值、临时值和引用。删除整个
模板T&AbstractBaseClass::function(){}
部分,您不需要它。假设get()既不是纯虚拟函数,也不是虚拟函数,并且它需要提供实现。get()的基类实现如何在基类中不存在成员变量的情况下返回对T的引用?@Skipher无法定义此类函数,这是正常的,因为定义这些函数没有意义。@Skipher不会。如果它不是一个虚拟函数,那么它在基类中有一个实现。若要返回基类中的引用,它需要基类中的成员变量(或全局变量,或非临时变量)。@n.m.但似乎我必须定义它,因为编译器告诉我“函数中无返回语句返回non void”。@Skipher。让我们再试一次。如果需要派生类将实现的函数,请将其设置为纯虚拟函数,而不要在基类中提供实现。如果您想在基类中实现函数,那么它必须仅在基类上下文中具有意义,而不考虑任何派生类。基类函数应该做什么?如果无法解释,则该函数没有存在的理由。假设get()既不是纯虚拟函数,也不是虚拟函数,并且它需要提供一个实现。一个基本的cl是怎样的
template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}

template <typename T>
T& AbstractBaseClass<T>::function(){
    //what must I do here when I don't have any member variable
}
template <class T>
class Base
{
   public:
     virtual T& get() = 0;
     virtual ~Base() = 0;
};

template <class T>
Base<T>::~Base() {}

template <class T>
class Derived: public Base<T>
{
   T t;
   public:
     T& get() override { return t; }
};