c++中关于闭包的另一个抽象类问题
Yet another abstract class issue in C++ with closures
我用g++ -std=c++11
参数编译这段代码有问题:
#include <iostream>
#include <unordered_map>
#include <functional>
#include <iostream>
using namespace std;;
template <typename T> class opt {
public:
opt() {};
~opt() {};
virtual int isEmpty() = 0;
virtual T getObject() = 0;
};
template <typename T> class oopt : public opt<T> {
private:
T ret;
public:
oopt(T obj) { ret = obj; };
~oopt() override;
int isEmpty() { return 0; };
T getObject() { return ret; };
};
int main(void) {
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
return 1;
}
此代码返回以下错误:
assoc_array.cc: In instantiation of ‘class oopt<int>’:
assoc_array.cc:68:63: required from here
assoc_array.cc:29:3: error: ‘oopt<T>::~oopt() [with T = int]’ marked override, but does not override
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional: In instantiation of ‘static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = opt<int>; _Functor = main()::<lambda(int)>; _ArgTypes = {int}]’:
/usr/include/c++/4.7/functional:2298:6: required from ‘std::function<_Res(_ArgTypes ...)>::function(_Functor, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type) [with _Functor = main()::<lambda(int)>; _Res = opt<int>; _ArgTypes = {int}; typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type = std::function<opt<int>(int)>::_Useless]’
assoc_array.cc:68:67: required from here
/usr/include/c++/4.7/functional:1909:7: error: invalid abstract return type for function ‘static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = opt<int>; _Functor = main()::<lambda(int)>; _ArgTypes = {int}]’
assoc_array.cc:7:29: note: because the following virtual functions are pure within ‘opt<int>’:
assoc_array.cc:11:15: note: int opt<T>::isEmpty() [with T = int]
assoc_array.cc:12:13: note: T opt<T>::getObject() [with T = int]
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional:1912:40: error: cannot allocate an object of abstract type ‘opt<int>’
assoc_array.cc:7:29: note: since type ‘opt<int>’ has pure virtual functions
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional:1743:2: error: ‘static _Functor* std::_Function_base::_Base_manager<_Functor>::_M_get_pointer(const std::_Any_data&) [with _Functor = main()::<lambda(int)>]’, declared using local type ‘main()::<lambda(int)>’, is used but never defined [-fpermissive]
哪里是我的错误使用闭包与静态转换到接口?我已经读过类似的回复(c++和抽象类中的继承,c++ -未声明的成员函数);在派生类),但似乎没有错误给出在编译时,如果我删除闭包定义。提前谢谢。
编辑
即使使用以下代码:
#include <iostream>
#include <unordered_map>
#include <functional>
#include <iostream>
using namespace std;;
template <typename T> class opt {
public:
opt<T>(T) {};
~opt<T>() {};
virtual int isEmpty() = 0;
virtual T getObject() = 0;
};
template <typename T> class oopt : public opt<T> {
private:
T ret;
public:
oopt<T>(T obj) { ret = obj; };
~oopt<T>() override;
int isEmpty() { return 0; };
T getObject() { return ret; };
};
int main(void) {
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
return 1;
}
我仍然有以下编译问题:
assoc_array.cc: In instantiation of ‘class oopt<int>’:
assoc_array.cc:26:64: required from here
assoc_array.cc:20:4: error: ‘oopt<T>::~oopt() [with T = int]’ marked override, but does not override
assoc_array.cc: In instantiation of ‘oopt<T>::oopt(T) [with T = int]’:
assoc_array.cc:26:64: required from here
assoc_array.cc:19:19: error: no matching function for call to ‘opt<int>::opt()’
assoc_array.cc:19:19: note: candidates are:
assoc_array.cc:9:4: note: opt<T>::opt(T) [with T = int]
assoc_array.cc:9:4: note: candidate expects 1 argument, 0 provided
assoc_array.cc:7:30: note: constexpr opt<int>::opt(const opt<int>&)
assoc_array.cc:7:30: note: candidate expects 1 argument, 0 provided
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional: In instantiation of ‘static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = opt<int>; _Functor = main()::<lambda(int)>; _ArgTypes = {int}]’:
/usr/include/c++/4.7/functional:2298:6: required from ‘std::function<_Res(_ArgTypes ...)>::function(_Functor, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type) [with _Functor = main()::<lambda(int)>; _Res = opt<int>; _ArgTypes = {int}; typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type = std::function<opt<int>(int)>::_Useless]’
assoc_array.cc:26:68: required from here
/usr/include/c++/4.7/functional:1909:7: error: invalid abstract return type for function ‘static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = opt<int>; _Functor = main()::<lambda(int)>; _ArgTypes = {int}]’
assoc_array.cc:7:30: note: because the following virtual functions are pure within ‘opt<int>’:
assoc_array.cc:11:16: note: int opt<T>::isEmpty() [with T = int]
assoc_array.cc:12:14: note: T opt<T>::getObject() [with T = int]
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional:1912:40: error: cannot allocate an object of abstract type ‘opt<int>’
assoc_array.cc:7:30: note: since type ‘opt<int>’ has pure virtual functions
In file included from assoc_array.cc:3:0:
/usr/include/c++/4.7/functional:1743:2: error: ‘static _Functor* std::_Function_base::_Base_manager<_Functor>::_M_get_pointer(const std::_Any_data&) [with _Functor = main()::<lambda(int)>]’, declared using local type ‘main()::<lambda(int)>’, is used but never defined [-fpermissive]
由于gcc是周围的标准编译器,他的错误不是最清楚的,甚至更多与c++比C,所以我通常编译一切与clang和gcc只是为了确保。用clang编译:我用aaronman代码得到这个,t
clang++ -std=c++11 test.cc ~
test.cc:20:20: error: only virtual member functions can be marked 'override'
~oopt<T>() override;
^~~~~~~~
test.cc:26:54: note: in instantiation of template class 'oopt<int>' requested here
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
^
test.cc:19:9: error: constructor for 'oopt<int>' must explicitly initialize the base class 'opt<int>' which does not have a default constructor
oopt<T>(T obj) { ret = obj; };
^
test.cc:26:54: note: in instantiation of member function 'oopt<int>::oopt' requested here
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
^
test.cc:7:29: note: 'opt<int>' declared here
template <typename T> class opt {
^
2 errors generated.
和这是你的第一个:
clang++ -std=c++11 test2.cc ~
test2.cc:20:17: error: only virtual member functions can be marked 'override'
~oopt() override;
^~~~~~~~
test2.cc:26:54: note: in instantiation of template class 'oopt<int>' requested here
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
^
1 error generated.
修复这些错误后,clang在链接时给了我这个:
clang++ -o -std=c++11 test2.o -Wall -Werror ~
test2.o: In function `std::_Function_handler<opt<int> (int), main::$_0>::_M_invoke(std::_Any_data const&, int)':
test2.cc:(.text+0x1a7): undefined reference to `oopt<int>::~oopt()'
test2.o:(.rodata._ZTV4ooptIiE[_ZTV4ooptIiE]+0x10): undefined reference to `oopt<int>::~oopt()'
test2.o:(.rodata._ZTV4ooptIiE[_ZTV4ooptIiE]+0x18): undefined reference to `oopt<int>::~oopt()'
clang: error: linker command failed with exit code 1 (use -v to see invocati
)
这不是一个精确的答案,但这可能会有很大帮助
好,首先去掉重写并使析构函数为虚函数(它们在继承时应该始终是虚函数)。而且析构函数在基类
中未实现。#include <iostream>
#include <unordered_map>
#include <functional>
#include <iostream>
using namespace std;;
template <typename T> class opt {
public:
opt() {};
virtual ~opt() {};
virtual int isEmpty() = 0;
virtual T getObject() = 0;
};
template <typename T> class oopt : public opt<T> {
private:
T ret;
public:
oopt(T obj) { ret = obj; };
~oopt(){};
int isEmpty() { return 0; };
T getObject() { return ret; };
};
int main(void) {
function<opt<int>(int)> fu = [](int j) { return (oopt<int>(10)); };
return 1;
}
现在编译。至于你最初得到的错误我不能说它们是从哪里来的因为我没有得到它们
好吧,希望我的解决方案是正确的:至少它编译:)。我将把它作为一个答案,以便收到关于解决方案的其他评论。再次感谢。
#include <iostream>
#include <unordered_map>
#include <functional>
#include <iostream>
#include <memory>
using namespace std;
//I need shared_pointers in order to gain the C++ dynamic casting
template <typename T> class Ptr {
shared_ptr<T> ptr;
public:
Ptr(T* obj) : ptr{obj} {};
Ptr(shared_ptr<T> obj) : ptr{obj} {};
~Ptr() { };
template <typename U> Ptr<U> Cast();
T* operator->() const {return &(*this->ptr);}
operator T() const { return (*this->ptr); };
};
template <typename T> template <typename U> Ptr<U> Ptr<T>::Cast(){
return Ptr<U>{dynamic_pointer_cast<U>(ptr)};
};
template <typename T> class opt {
protected:
T ret;
public:
~opt() {};
virtual int isEmpty() = 0;
virtual T* getObject() = 0;
operator T() const { return ret; };
};
template <typename T> class oopt : public opt<T> {
public:
oopt(T obj) {
this->ret = obj;
};
int isEmpty() { return 1; };
T* getObject() { return &this->ret; }
};
template <typename T> class eopt : public opt<T> {
public:
eopt() { }; //for downcasting matters
T* getObject() { return nullptr; } //
int isEmpty() { return 1; };
};
int main(void) {
Ptr<oopt<int>> u(new oopt<int>(500));
Ptr<opt<int>> w = u.Cast<opt<int>>();
cout << (*(w->getObject())) << "n" ;
Ptr<opt<int>> none(new eopt<int>());
w = none.Cast<opt<int>>();
if ((w->getObject()) == nullptr) {
cout << "null" << "n";
}
return 1;
}
相关文章:
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如何在 C 中包装C++具有参数的类方法或返回另一个C++类的实例?
- 如何将抽象类的可访问性限制为另一个抽象类及其子类?
- 错误 - 变量类型 "X" 是一个抽象类 - c++
- 将其转换为共享指针,并将其作为参数传递给另一个C++类
- 使用另一个模板类的嵌套名称说明符专用化模板类
- 从具有相同基数的另一个派生类调用派生类的非 const 方法
- 如何知道模板类中另一个模板类的类型
- 创建一个抽象类类型的集合,shared_ptr的抽象类向量
- 为什么当一个模板类继承自另一个模板类时,需要重新指定 typedef 并限定函数调用?
- 从抽象基类访问另一个基类成员
- 从另一个抽象类得出一个抽象类时,C 中的类重新定义错误
- c++抽象类在另一个基类中的实现
- 如何重写调用另一个抽象类的抽象类的虚拟函数
- c++中关于闭包的另一个抽象类问题
- 给定抽象基类 X,如何创建另一个模板类 D,<T>其中 T 是从 X 派生的类的类型?