模板类内部的模板重载行为不同

时间:2018-08-07 00:16:10

标签: c++ arrays templates pointers template-specialization

在以下代码中产生(LiveExample):

  

类模板指针

     

类模板指针

     

模板指针

     

大小为10的模板数组

#include <iostream>
#include <utility>
#include <type_traits>

template <class TVar>
class CVar
{
public:
    void classTemplate(TVar *) const
    {
        std::cout << "Class template pointer\n";
    }

    template<unsigned sz>
    void classTemplate(TVar(&)[sz]) const
    {
         std::cout << "Class template array with size " << sz << "\n";
    }

};

template<typename T>
void regTemplate(T)
{
    std::cout << "Template pointer\n";
}

template<typename T, unsigned sz> void regTemplate(T(&)[sz])
{
    std::cout << "Template array with size " << sz << "\n";
}

int main()
{
  unsigned int test[10] = {};

  CVar<unsigned> *cFoo = new CVar<unsigned>();
  cFoo->classTemplate(&test[0]);
  cFoo->classTemplate(test);

  regTemplate(&test[0]);
  regTemplate(test);
}
  1. 为什么当我在类中重载模板时,它无法解析所需的功能-也就是说,调用cFoo->classTemplate(test);时,响应将是Class template array with size 10

    < / li>
  2. 如何在不更改cFoo->classTemplate(test);的情况下在1中获得期望的结果?请注意,void CVar<TVar>::classTemplate(TVar(&)[sz]) const可能会根据需要更改

1 个答案:

答案 0 :(得分:2)

在其他条件相同的情况下,重载分辨率更喜欢非模板而不是模板。在classTemplate中,一个重载是一个函数模板,而另一个重载是一个非模板成员函数。

regTemplate情况下,它们都是函数模板:选择一个采用数组的模板是因为它更加专业。确实,如果您将第一个重载更改为T*,则通话将变得模棱两可。