C++ 获取/推断模板函数中返回值的类型

C++ 获取/推断模板函数中返回值的类型,c++,templates,boost,return-value,C++,Templates,Boost,Return Value,我正在使用Boost图形库,并在此基础上构建了自己的类 现在,我有以下功能: template< class VERTEXPROPERTIES > VERTEXPROPERTIES& properties(const Vertex& v) const { typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vert

我正在使用Boost图形库,并在此基础上构建了自己的类

现在,我有以下功能:

template< class VERTEXPROPERTIES >
VERTEXPROPERTIES& properties(const Vertex& v) const
{   
    typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph_);

    return param[v];
}
模板
顶点属性和特性(常量顶点和v)常量
{   
typename属性映射::const\u type param=get(顶点属性,图);
返回参数[v];
}
当我在类模板中使用此函数时,如下所示:

template< class VERTEXPROPERTIES, class EDGEPROPERTIES >
class Graph
{
// all the code
};
template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE >
class FilteredGraph
{
// all the code
};
模板
类图
{
//所有代码
};
它起作用了。 但是,当我想在这样的类中使用它时:

template< class VERTEXPROPERTIES, class EDGEPROPERTIES >
class Graph
{
// all the code
};
template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE >
class FilteredGraph
{
// all the code
};
template
类过滤图
{
//所有代码
};
如果将properties()函数应用于FilteredGraph对象,编译器会抱怨找不到该函数。
据我所知,这可能是由于参数列表中缺少模板参数造成的。
对于Graph类,这个模板参数很容易找到,因为它是在创建Graph对象时定义的。
但是对于FilteredGraph,它应该能够从GRAPH模板参数中推断出来。
再次强调,我认为编译器在获取正确的返回值类型时会遇到问题,因为这可能是事先发现的必要条件…
我真的希望在properties()函数中保留这个概念,因为它允许其他函数保持通用性。

你对如何解决这个问题有什么想法吗?可能保留这个概念吗?

再次,我为没有提供更多信息而道歉。
在我看来,编译器无法推断出依赖类型。在使用模板时,我曾多次遇到此问题。
我将在这里提供修复,以防有人遇到类似问题

FilteredGraph使用Graph的实例(基本上是具有内部自定义属性的邻接列表)作为其输入。Graph类有两个模板参数,一个用于顶点属性,一个用于边属性。
作为一点旁注,使用捆绑属性(旧版本的boost graph library不支持,某些编译器也不支持),我认为可以避免这个问题,因为您不需要额外的函数返回(可能)未知类型的值。 由于传递给FilteredGraph的Graph对象需要为某些特定类型的顶点/边属性指定,因此实际上可以提取此信息。
我通过以下途径实现了这一目标:

/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, vertex_properties_t>::type >::value_type VProps;
/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, edge_properties_t>::type >::value_type EProps;
///边的内部属性的类型
typedef typename property\u traits::value\u type VProps;
///边的内部属性的类型
typedef typename属性\u traits::值\u类型EProps;
然后定义:

VProps& properties(const Vertex& v)
{
        typename property_map<FilteredGraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph_);
        return (param[v]);
}
VProps和属性(常量顶点和v)
{
typename属性映射::type param=get(顶点属性,图);
返回(参数[v]);
}
再次感谢您对这个问题的关注,很抱歉没有提供更多信息


致以最诚挚的问候。

请注意编译后的错误和类定义。你没有给我们任何信息,对此我深表歉意。我没有在这里发表这篇文章,因为我觉得这只会把问题弄得一团糟。编译器的错误只是找不到代码中使用的函数。我能够将它修复为boost库提供的属性功能。我会分别发布答案。不,别担心。我不会把答案弄乱的。编译错误通常非常有用。有时有点神秘,但更多的时候,非常精确。你可以用问题左边的勾号接受你的答案(包括你自己的答案)。这会将问题标记为已回答,并使具有相同问题的其他人更容易找到解决方案。我认为您应该使用更多的typedef。您的代码行很长。关于“接受您的答案”,它说我只能在两天内标记为已解决。谢谢你的提示。关于typedef,它肯定会提高可读性。然而,有些读者可能会对此感到困惑。那么我知道你是第一个声称typedef令人困惑的人;-)