gpt4 book ai didi

c++ - C++ 中另一个带有闭包的抽象类问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:51 26 4
gpt4 key购买 nike

我在使用 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]

我使用闭包静态转换到接口(interface)的错误在哪里?我已经阅读过类似的回复( C++ and inheritance in abstract classesC++ - "Member function not declared" in derived class ),但如果我删除闭包定义,似乎在编译时不会给出错误。提前致谢。

编辑

即使使用以下代码:

#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

上)

这不是一个准确的答案,但这可能会有很大帮助

关于c++ - C++ 中另一个带有闭包的抽象类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014945/

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