模板化的初始化列表构造函数推导失败

时间:2014-12-29 03:26:21

标签: c++ templates constructor initializer-list

我有一个模板构造函数:

template <typename Edge>
Adjacency_list_directed(const std::initializer_list<Edge>& l) {
    for (auto& edge : l) {
        adj[edge.source][edge.dest] = edge.get_weight();
        adj[edge.dest][edge.source] = edge.get_weight();
    }       
}

我想使用这些辅助构造函数结构:

template <typename V>
struct Weighted_edge {
    V source;
    V dest;
    int weight;
    // can't maintain as POD because V might not be POD
    Weighted_edge(V u, V v, int w) : source{u}, dest{v}, weight{w} {} 
    int get_weight() const {return weight;}
};
template <typename V>
struct Unweighted_edge {
    V source;
    V dest;
    Unweighted_edge(V u, V v) : source{u}, dest{v} {} 
    int get_weight() const {return 1;}
};

为了方便构造语法:

template <typename V>
using digraph = Adjacency_list_directed<V>;

sal::digraph<int> g {{1,2}, {2,3}, {3,4}, {4,1}};

然而,由于没有匹配功能(找不到Edge模板)而失败了

但这有效:

sal::digraph<int> g {Unweighted_edge<int>{1,2}, {2,3}, {3,4}, {4,1}};`

我认为这是因为没有边缘的显式顶点类型规范,编译器无法确定V是什么。它应该能够区分Unweighted_edgeWeighted_edge,因为它们需要不同数量的元素来构建。

有没有办法超过这个? (我尝试在未加权和加权边上创建2个非模板构造函数,但是这个错误是模糊的,你可以有多个initializer_list构造函数但是有不同的类型吗?)

0 个答案:

没有答案
相关问题