Предположим, у меня есть класс, который определяет аргументы шаблона, такие как std::function
синтаксис.Использовать абстрактный класс в качестве аргумента шаблона при использовании синтаксиса типа `std :: function`
// Class that accept template arguments like std::function
template< class T >
class abstraction;
template< class TAbstract, class ...TDeriveds >
class abstraction< TAbstract(TDeriveds...) >
{
public:
using abstract_component_t = TAbstract;
abstraction()
{
int i = 0;
}
};
// Abstract base class
class base
{
public:
virtual void func() = 0;
};
// Derived class
class derived : public base
{
public:
void func() override
{
}
};
Когда я использую абстрактный класс в качестве параметра шаблона для этого класса (abstraction<base(derived)>
) я получаю эти ошибки:
VC++ 2015.3 error: C2259: 'base': cannot instantiate abstract class
GCC 4.9.2 error: invalid abstract return type 'base'
я хочу знать, это ошибка в компиляторах или это запрещено использовать абстрактные типы с этим синтаксисом?
Link к образцу источника.
Возможно, здесь будет полный источник, это яснее, и это не так уж много кода. Приходит вплоть до написания требующий базового экземпляра, поскольку это тип значения. Я не говорю «standardeze» достаточно хорошо, но, вероятно, кто-то другой может придумать точное стандартное правило, запрещающее это. –
stijn
Интересно, что он отлично компилируется с clang 3.9. –