【发布时间】:2019-01-01 17:54:56
【问题描述】:
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;
虽然我已经覆盖了派生类中的纯虚方法,但我得到了这个错误,并且看起来它应该是一个模板类。如果我需要做类似的事情,我应该如何实施?
【问题讨论】:
-
不,这与派生类无关——编译器在编译 main.cpp 时甚至不知道 private/Base.h
-
不同措辞question,答案基本相同。
-
您的意思是
std::make_shared< Base<std::string>>()吗?编译器如何知道调用哪个派生类来构造接口类?
标签: c++ templates interface abstract-class