1

我想要一个具有两个同名方法的模板类:一个采用 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]'

我现在看了这个教程: 在此处输入链接描述

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

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

但现在我得到这个错误:

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

再次感谢

4

2 回答 2

1

T如果是,您需要禁用第二个重载Rational。使用 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 中实现相同的功能)

于 2013-09-10T16:25:10.750 回答
0

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

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

一开始没有编译的原因是我在这个文件中有实现,它是一个 hpp 文件(我知道这真的很糟糕,但这是一个练习,这是我们得到的唯一选择)。然后,为了雪上加霜,我将此文件包含在两个 cpp 文件中,此时我得到了错误:

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

@DanielFrey,无论如何感谢您尝试帮助我!

于 2013-09-11T08:33:36.713 回答