【问题标题】:function templates with class template typedef arguments具有类模板 typedef 参数的函数模板
【发布时间】:2010-06-21 16:08:03
【问题描述】:

以下代码是我在大型项目中尝试做的一个示例:

#include <iostream>
#include <vector>

// standard template typedef workaround
template<typename T> struct myvar {typedef std::vector<T> Type;};

template<typename T>
T max(typename myvar<T>::Type& x)
// T max(std::vector<T>& x)
{
  T y;
  y=*x.begin();
  for( typename myvar<T>::Type::iterator it=x.begin(); it!=x.end(); ++it )
    if( *it>y ) 
      y=*it;
  return y;
} 

int main(int argc, char **argv)
{
  myvar<int>::Type var(3);
  var[0]=3;
  var[1]=2;
  var[2]=4;
  std::cout << max(var) << std::endl;
  return 0; 
} 

当我尝试编译它时,我得到:

>g++ delme.cpp -o delme
delme.cpp: In function ‘int main(int, char**)’:
delme.cpp:25: error: no matching function for call to ‘max(std::vector<int, std::allocator<int> >&)’

但是,如果我注释掉第 8 行并取消注释第 9 行,它会正确编译并给出:

>g++ delme.cpp -o delme
>./delme 
4

有人能解释一下为什么使用typename myvar&lt;T&gt;::Type&amp; 的max() 函数模板定义不被视为‘max(std::vector&lt;int, std::allocator&lt;int&gt; &gt;&amp;)’ 的匹配项,有没有办法在不使用底层std::vector&lt;T&gt;&amp; 类型的情况下使其匹配?

【问题讨论】:

    标签: c++ function templates arguments typedef


    【解决方案1】:

    从嵌套类型推导出封闭类型(或封闭类型的任何属性)是不可能的。它是 C++ 中所谓的 non-deduced context 的例子之一。

    虽然模板函数声明本身是合法的,但由于无法执行模板参数推导,您将无法仅将函数调用为max(var)。在您的情况下,编译器将无法确定std::vector&lt;int&gt; 类型的参数x 意味着T 是myvar&lt;int&gt;。

    你总是必须明确地为max 指定模板参数,如

    std::cout << max<int>(var) << std::endl;
    

    如何解决此问题取决于您通过引入封闭的myvar 模板试图实现的目标。

    【讨论】:

    • 我明白了,谢谢。 myvar 模板的原因是在 ublas 中使用 column_major 矩阵,而不需要用户始终指定它,即 namespace Cheb { template struct matrix { typedef boost::numeric::ublas::matrix 类型; };然后我希望我的函数有Cheb::matrix&lt;T&gt;::type 类型的参数。我没有太多的模板化函数,所以我可以通过明确指定我的模板参数来生存,但最好不必这样做。
    • 如果调用 Max() 的地方也是一个模板,那么该模板的参数是否可以作为模板参数传递给 Max() - 这会解析类型吗?
    【解决方案2】:

    您是否考虑过使用std::max_element 而不是自己编写代码?它需要一个开始和结束迭代器,我相信在这里可以满足您的要求。

    【讨论】:

    • 谢谢,但我只是以max() 为例。我还有其他功能会出现同样的问题。我会记住std::max_element,因为下次我想要一个最大值... :-)
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2010-12-17
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多