This question already has answers here: Where and why do I have to put the “template” and “typename” keywords? (6个答案) 2年前关闭。 我遇到了一个问题,对于依赖类型,如果boost::multi_index::multi_index_container<...>::get<C>()是依赖类型,则C会中断。如果不依赖,则不会发生相同的情况。 MCVE,g ++ 7.1.0(如果声明is_same_v ,则也为6.3.0):#include <type_traits>#include <boost/multi_index_container.hpp>#include <boost/multi_index/ordered_index.hpp>#include <boost/multi_index/identity.hpp>#include <boost/multi_index/member.hpp>#include <boost/multi_index/mem_fun.hpp>#include <boost/multi_index/random_access_index.hpp>#define MEMBER(T, M) boost::multi_index::member<T, decltype(T::M), &T::M>#define TAGNMEMBER(T, M) boost::multi_index::tag<MEMBER(T, M)>, MEMBER(T, M)namespace ns1 { struct Elem { size_t id_; bool operator<(const Elem& rhs) const { return id_ < rhs.id_; } }; using Cont = boost::multi_index::multi_index_container< Elem, boost::multi_index::indexed_by< boost::multi_index::ordered_unique<boost::multi_index::identity<Elem>>, boost::multi_index::ordered_unique<TAGNMEMBER(Elem, id_)> > >;}namespace ns2 {// void f(ns1::Cont& cont) // always works template<typename C> void f(C& cont) { ns1::Cont& c = cont; static_assert(std::is_same_v<decltype(cont), ns1::Cont&>); cont.get<MEMBER(ns1::Elem, id_)>(); // v1 - error if dependent type //c.get<MEMBER(ns1::Elem, id_)>(); // v2 - always works }}int main(){ ns1::Cont cont; cont.insert({0}); ns2::f(cont);}您能否提一些建议? 最佳答案 表示get是模板:cont.template get<MEMBER(ns1::Elem, id_)>(); // now works它与c一起使用,因为您显式声明了它的类型(ns1::Cont),因此,get不再依赖。关于c++ - boost multi_index依赖于依赖类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45536657/ 10-13 08:39