繁体   English   中英

类成员列表的 C++ 模板构造

[英]C++ template construction for class member lists

所以我之前制作了一些 C++ 模板:一些非常基本的例子,说明数学数字类的奇怪重复模板模式 这次我尝试使用相同的模式为一个类的对象创建一个列表或“网络”,他们可以将自己添加到其中并环顾其他对象。 我想我可以使用静态 std::list 来做到这一点。 所以我的尝试是这样的:

template<class C> class HasNetwork{
  public:
  HasNetwork(){}
  static list<C*> m;
};
template<class C> list<C*> HasNetwork<C>::m = list<C*>();
class IHaveNetwork: public HasNetwork<IHaveNetwork>{
  public:
  IHaveNetwork(){ m.push_back(this); }
};
int main(){
  IHaveNetwork lHF, lHF2;
  //for(list<IHaveNetwork*>::iterator it = lHF.m->begin();  ; it++);
  return 0;
}

它似乎可以编译,但我遇到了令人讨厌的链接错误(即使 for 循环迭代器已注释掉)。 也许我需要做一些转换,或者直到构造函数完成后才定义“this”?

这是链接错误:

/tmp/templatest-912860.o: In function `__clang_call_terminate':
templatest.cpp:

(.text.__clang_call_terminate[__clang_call_terminate]+0x9): undefined reference to `__cxa_begin_catch'


templatest.cpp:(.text.__clang_call_terminate[__clang_call_terminate]+0x12): undefined reference to `std::terminate()'


/tmp/templatest-912860.o: In function `__gnu_cxx::new_allocator<std::_List_node<IHaveNetwork*> 

>::deallocate(std::_List_node<IHaveNetwork*>*, unsigned long)':

模板st.cpp:

 (.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE10deallocateEPS4_m[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE10deallocateEPS4_m]+0x1c): undefined reference to `operator delete(void*)'

/tmp/templatest-912860.o: In function `std::list<IHaveNetwork*, std::allocator<IHaveNetwork*> 

>::_M_insert(std::_List_iterator<IHaveNetwork*>, IHaveNetwork* const&)':

模板st.cpp:

(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE9_M_insertESt14_List_iteratorIS1_ERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE9_M_insertESt14_List_iteratorIS1_ERKS1_]+0x31): undefined reference to 

`std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'

/tmp/templatest-912860.o:在函数`std::list >::_M_create_node(IHaveNetwork* const&)'中:templatest.cpp:

(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xa0): undefined reference to `__cxa_begin_catch'

templatest.cpp:(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xbb): undefined reference to `__cxa_rethrow'
templatest.cpp:    

(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xce): undefined reference to `__cxa_end_catch'

/tmp/templatest-912860.o: In function `__gnu_cxx::new_allocator<std::_List_node<IHaveNetwork*> >::allocate(unsigned long, void const*)':

templatest.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv]+0x33): undefined reference to `std::__throw_bad_alloc()'

templatest.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv]+0x40): undefined reference to `operator new(unsigned long)'

/tmp/templatest-912860.o:(.eh_frame+0x13):对`__gxx_personality_v0'的未定义引用

我无法重现。

这是一个稍微修改过的代码版本,它编译链接并在没有警告的情况下运行(我只需要修复一些间接级别的错误):

#include <iostream>
#include <list>
#include <string>

template<class C> class HasNetwork{
  public:
  HasNetwork(){}
  static std::list<C*> m;
};
template<class C> std::list<C*> HasNetwork<C>::m = std::list<C*>();
class IHaveNetwork: public HasNetwork<IHaveNetwork>{
    std::string name;
  public:
      IHaveNetwork(const std::string &name): name(name) { m.push_back(this); }
      std::string getName() const {
          return name;
      }
};
int main(){
  IHaveNetwork lHF("foo"), lHF2("bar");
  for(std::list<IHaveNetwork*>::iterator it = lHF.m.begin();  it != lHF.m.end(); it++) {
      std::cout << (*it)->getName() << std::endl;
  }
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM