c++类型定义需要::type

C++ typedefs requiring ::type

本文关键字:type 类型 定义 c++      更新时间:2023-10-16

尝试从BGL开始,这意味着我要从很多类型开始:

#include <iostream> //std::cin, std::cout
#include <tuple> //std::tie
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
using namespace boost;
typedef adjacency_list<vecS,vecS,undirectedS,no_property,property<edge_weight_t,int> > Graph;
typedef graph_traits<Graph> Traits;
typedef Traits::vertex_descriptor Vertex;
typedef Traits::edge_descriptor Edge;
typedef property_map<Graph, edge_weight_t>::type EdgeWeightMap; //::type necessary (why?)
int main(int argc, char* argv[]){
    int n = ...;
    Graph g(n);
    EdgeWeightMap weight_of;
    Edge e;
    bool success;
    int s,t,w;
    std::cin >> s >> t >> w;
    tie(e,success) = add_edge(s,t,g);
    if(success)weight_of[e] = w;
}

我想知道为什么EdgeWeightMap的类型定义中的::type是必要的。如果省略它,得到

错误:' operator[] '不匹配(操作数类型为

)
‘EdgeWeightMap {aka boost::property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, boost::property<boost::edge_weight_t, int> >, boost::edge_weight_t>}’

‘Edge {aka boost::detail::edge_desc_impl<boost::undirected_tag, unsigned int>}’

)[e] = w;

(抱歉格式,类型' <>似乎干扰了blockquote)

事实上,当我尝试

EdgeWeightMap weight_of = get(edge_weight,g);
我得到一个

错误:从

转换
‘boost::detail::adj_list_any_edge_pmap::bind_<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, boost::property<boost::edge_weight_t, int> >, boost::property<boost::edge_weight_t, int>, boost::edge_weight_t>::type {aka boost::adj_list_edge_property_map<boost::undirected_tag, int, int&, unsigned int, boost::property<boost::edge_weight_t, int>, boost::edge_weight_t>}’

转换为非标量类型

‘EdgeWeightMap {aka boost::property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, boost::property<boost::edge_weight_t, int> >, boost::edge_weight_t>}’

请求

edge_weight = get(ge_weight,g);

现在,我可以看到这些是不同的类型,我不明白的是为什么它们不同。由于我有点想避免意外,谁能告诉我什么时候需要::type,什么时候不能使用它?

从property_map文档中可以看出,"property_map"模板被设计为提供类型,而不是类型。property_map结构恰好包含两种类型。typeconst_type,分别用于可变和不可变类型