public / Interface.h
#pragma once
template <typename T>
class BaseInterface {
public:
virtual void foo() = 0;
};
private / Base.h
#pragma once
#include "../public/Interface.h"
template <typename T>
class Base : public BaseInterface<T> {
public:
virtual void foo() override;
};
template <typename T>
inline void Base<T>::foo() {
}
main.cpp
#include <iostream>
#include <memory>
#include "public/Interface.h"
int main() {
auto base = std::make_shared< BaseInterface<std::string> >();
base->foo();
return 0;
}
出现此错误:
/usr/include/c++/5/ext/new_allocator.h:120:4: error: invalid new-expression of abstract class type ‘BaseInterface<std::__cxx11::basic_string<char> >’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
AbstractPureVirtual/public/Interface.h:4:7: note: because the following virtual functions are pure within ‘BaseInterface<std::__cxx11::basic_string<char> >’:
class BaseInterface {
AbstractPureVirtual/public/Interface.h:6:17: note: void BaseInterface<T>::foo() [with T = std::__cxx11::basic_string<char>]
virtual void foo() = 0;
尽管在派生类中重写了纯虚方法,但仍收到此错误,并且似乎希望将其作为模板类。如果我需要做类似的事情,该如何实现呢?
答案 0 :(得分:1)
make_shared
创建与您指定的类完全相同的对象。它无法知道其派生类,因此make_shared< BaseInterface<std::string> >()
本质上会调用new BaseInterface<std::string>
,并且不允许创建抽象类的对象。这与模板无关。如果将它们替换为普通类,错误仍然存在。
答案 1 :(得分:0)
auto base = std::make_shared< BaseInterface<std::string> >();
您尝试在此处创建类型BaseInterface<std::string>
的具体对象。我怀疑你想要
auto base = std::make_shared< Base<std::string> >();
或者也许
std::shared_ptr< BaseInterface<std::string> > base = std::make_shared< Base<std::string> >();