2015-05-07 43 views
3

考虑一些抽象类A函数签名返回抽象类

class A 
{ 
    virtual void f() = 0; 
}; 

假设我要声明函数签名类型返回这个类:错误

using Type = A(); 

鉴于此代码,gcc-4.8.2 failes

error: ‘type name’ declared as function returning an abstract class type 

clang-3.3 c这很好地诠释了这一点。

我试图谷歌这个问题,但没有找到任何有用的东西。此代码是否符合标准?如果不是,禁止声明这种签名类型的原因是什么?我在宣言中没有看到任何问题。

免责声明:我不创建该类型的实例,我在声明中描述的签名只是感兴趣。

对于那些对这种声明的有用性感兴趣的人:我有一些工厂容器,在添加新工厂以学习新工厂时使用签名,如Interface(Arguments...);实际返回的类型是基于单独的特征类别确定的,参数为Interface

很显然,我可以分开签名Interface,但它不会看不错:(

+0

'我在宣言中看不到任何问题。'好的。但你能看到这种声明的用途吗? – user2079303

+1

@ user2079303包含了我的用例。 – lisyarus

回答

8

这段代码标准 - 是否符合?

号根据C++ 11 [class.abstract]/3,“抽象类不应用作参数类型,作为函数返回类型,或作为显式转换的类型。”

如果不是,禁止声明这种签名类型的原因是什么?

该签名的函数不能存在,因为它在返回时必须创建一个抽象类类型的对象。

我只是在声明中看不到任何问题。

确实,只是一个声明是无害的。但它也有些无用;它不会引用任何可能存在的类型。

对于您的用例,您可以使用引用或指针作为返回类型。

+0

我收录了一个我在这个问题中遇到的用例。 – lisyarus

+0

这样的函数不能存在的事实并不禁止在某些模板元编程中使用这种类型。 – lisyarus

0

您不能定义创建抽象类的对象。因此,一个函数返回一个抽象对象只没有任何意义。如果你仍然想以某种方式回报A,你必须返回一个指针(其实必须指向一个具体子类的对象)。

+0

我*不想*创建类型为'A'的对象或从函数返回它。我只想*声明一个签名*返回这种类型。 – lisyarus

+0

@lisyarus希望你会返回一个*指针*或*引用*到您的基类,而不是价值,或者你会[切片](https://stackoverflow.com/questions/274626/what-is-object-切片)派生类的实例。 – CoryKramer

+0

会知道为什么我会对此做出反对...(我给出了更差的答案,没有降低薪酬;)) – user463035818