OpenMesh (http://www.openmesh.org) でちょっとしたものを作ろうと思って以前の project を compile したら何故か以下の template の new の型が悪いという error のためにコンパイルできない.
/usr/X11R6/bin/g++
-Wp,-MD,Ubuntu9.04/VisOMTriMeshDNode.dep -DHAVE_SSTREAM -DUSE_GMU_GERR
-std=c++0x -Wall -Wnon-virtual-dtor -Woverloaded-virtual
-DARCH_LINUX-DCOMP_GCC -I/usr/X11R6/include -I/usr/X11R6/include
-I/usr/include/tcl8.4 -I/usr/include/qt4 -I/usr/include/qt4/QtCore
-I/usr/include/qt4 -I/usr/include/qt4/QtGui
-I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtOpenGL
-I/opt/OpenMesh/src -I/home/project/shared_proj -fPIC -g
-Wno-uninitialized -D_INCTEMP -DUSE_GMU_GERR
-DGMU_DBG_STRIPPATH=\"ALL\" -o Ubuntu9.04/VisOMTriMeshDNode.o -c
VisOMTriMeshDNode.cc
/usr/include/c++/4.3/ext/new_allocator.h: In member function 'void
__gnu_cxx::new_allocator<_Tp>::construct(_Tp*, _Args&&
...) [with _Args = long int, _Tp = OpenMesh::BaseProperty*]':
/usr/include/c++/4.3/bits/stl_vector.h:703: instantiated from 'void
std::vector<_Tp, _Alloc>::push_back(_Args&& ...) [with
_Args = long int, _Tp = OpenMesh::BaseProperty*, _Alloc =
std::allocator<OpenMesh::BaseProperty*>]'
/opt/OpenMesh/src/OpenMesh/Core/Utils/PropertyContainer.hh:104:
instantiated from 'OpenMesh::BasePropHandleT<T>
OpenMesh::PropertyContainer::add(const T&, const std::string&)
[with T = OpenMesh::Attributes::StatusInfo]'
/opt/OpenMesh/src/OpenMesh/Core/Mesh/BaseKernel.hh:133: instantiated
from 'void
OpenMesh::BaseKernel::add_property(OpenMesh::VPropHandleT<T>&,
const std::string&) [with T = OpenMesh::Attributes::StatusInfo]'
/opt/OpenMesh/src/OpenMesh/Core/Mesh/ArrayKernel.hh:486: instantiated from here
/usr/include/c++/4.3/ext/new_allocator.h:114: error: invalid conversion from 'long int' to 'OpenMesh::BaseProperty*'
以前コンパイルできたのに何故できないのかと,まずは OpenMesh を RC3 からRC5 に update
したが,同じエラーである.私の嫌いな template のinstantiation error だ.いったいどこから long int
が来ているのかとコードを読むこと3時間,-std=c++0x が悪いことに気がついた.しばらく前に hash_map はstandard でなく,やがて unordered_map
になるというので,この option をセットしたのを忘れていた.また一日無駄に過ごしてしまった.