模板类的超载/专业化方法

时间:2013-09-10 16:20:10

标签: c++ templates

我想要一个带有两个同名方法的模板类:一个带有T&类型参数的模板。另一个需要Rational&作为Rational是我的类的参数。 我不确定这是模型专用还是简单的重载 另一件事是我没有h和cpp文件,而是一个包含实现声明的hpp文件。

这对于什么是正确的sytanx?

像这样:

template <class T> class Matrix
{

    bool hasTrace (Rational& trace) const
    {
    }

    bool hasTrace (T& trace) const
    {
    }
}

只有这段代码无法编译,我收到编译错误:

..\/Matrix.hpp:200:7: error: 'bool Matrix<T>::hasTrace(T&) const [with T = Rational]' cannot be overloaded
..\/Matrix.hpp:180:7: error: with 'bool Matrix<T>::hasTrace(Rational&) const [with T = Rational]'

我现在看了这个教程: enter link description here

在模板专业化下,它表示我想要完成的工作可以通过在类定义之外定义专用函数来完成,同时用我希望重新定义函数的特定类型替换模板类型:

bool Matrix<Rational>::hasTrace (Rational& trace) const
{
}

但现在我收到了这个错误:

..\/Matrix.hpp:227:6: error: specializing member 'Matrix<Rational>::hasTrace' requires 'template<>' syntax

再次感谢

2 个答案:

答案 0 :(得分:1)

如果TRational,则需要停用第二次重载。使用C ++,您可以使用专业化:

template <class T> class Matrix
{
    bool hasTrace (Rational& trace) const
    {
    }

    bool hasTrace (T& trace) const
    {
    }
};

template<> class Matrix< Rational >
{
    bool hasTrace (Rational& trace) const
    {
    }
};

使用C ++ 11,您还可以使用std::enable_if

#include <type_traits>

template <class T> class Matrix
{
    bool hasTrace (Rational& trace) const
    {
    }

    typename std::enable_if< !std::is_same< T, Rational >::value, bool >::type
    hasTrace (T& trace) const
    {
    }
};

(或者您可以使用Boost的类型特征在C ++ 98中实现相同的目标)

答案 1 :(得分:0)

解决方案确实是在类之外定义专门的方法,如下所示:

template <> bool Matrix<Rational>::hasTrace (Rational& trace) const
{
}

最初没有编译的原因是我在这个文件中实现了一个hpp文件(我知道它真的很糟糕,但这是一个练习,这是我们给出的唯一选项)。 为了加重侮辱伤害,我把这个文件包含在两个cpp文件中,此时我收到了错误:

multiple definition of `Matrix<Rational>::hasTrace(Rational&) const'

@DanielFrey,无论如何,谢谢你试图帮助我!