gpt4 book ai didi

c++ - 模板类的重载/特化方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:00 25 4
gpt4 key购买 nike

我想要一个具有两个同名方法的模板化类:一个采用 T& 类型的参数,另一个采用 Rational& 作为参数,其中 Rational 是我的类。我不确定这是否称为模板特化或只是简单的重载另一件事是我没有 h 和 cpp 文件,而是一个包含实现声明的 hpp 文件。

正确的语法是什么?

像这样的东西:

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

再次感谢

最佳答案

如果 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 中实现相同的功能)

关于c++ - 模板类的重载/特化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com