我想要一个具有两个同名方法的模板化类:一个采用 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
再次感谢
如果 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 中实现相同的功能)
我是一名优秀的程序员,十分优秀!