gpt4 book ai didi

c++ - C++ 中带有纯虚方法的抽象模板类

转载 作者:行者123 更新时间:2023-11-28 04:35:43 25 4
gpt4 key购买 nike

公共(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() {
}

主要.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;

虽然我已经重写了派生类中的纯虚方法,但我还是收到了这个错误,看起来它应该是一个模板类。如果我需要做类似的事情,我应该如何实现?

最佳答案

make_shared创建一个与您指定的类完全相同的对象。它无法知道它的派生类,所以 make_shared< BaseInterface<std::string> >()本质上调用 new BaseInterface<std::string> , 并且不允许创建抽象类的对象。这与模板无关;如果将它们替换为普通类,错误仍然存​​在。

关于c++ - C++ 中带有纯虚方法的抽象模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com