[英]compilation error: overloading operator()
VisualStudio 2008(VC ++ 9)重载operator()的问题
社区大家好!
看来,operator()的重载版本必须在其参数列表中全部不同,而与返回类型无关。
我有以下情况:
class Sha256{
public:
QVector<quint32> operator()(QString const& data);
QByteArray operator()(QByteArray const& data);
QVector<quint32> operator()(QByteArray const& data); // this is line 168
...
}
最后的声明导致以下编译错误:。\\ sha256.cpp(168):错误C2556:'QVector Sha256 :: operator()(const QByteArray&)':重载函数仅与'QByteArray Sha256 :: operator( )(const QByteArray&)'与[T = uint]
另一方面,以下声明起作用:
class Sha256{
public:
QVector<quint32> operator()(QString const& data);
QByteArray operator()(QByteArray const& data);
...
}
因为他们有不同的论点。
一种方法是在第一种情况下添加一个额外的参数,例如
QByteArray<quint32> operator()(QByteArray const& data, bool getByteArray)
但这很尴尬,不直观,也不干净(返回类型将是QByteArray,与getByteArray的值无关,即使是false)。
另一种方法是使用模板函数,例如
template<class T> T operator()(QByteArray const& ba)
template<class T> T operator()(QString const& str)
但是T只能是少数“受支持的”类型(QByteArray和QVector),因此如果使用错误的T类型,用户可能会遇到麻烦。 此版本似乎容易出错。
因此,我的问题是:1.为什么在签名中没有考虑功能对象的返回类型,以区分功能的不同形式(如“经典”功能)? 2.是否有比添加其他虚拟参数更好的方法?
感谢您的宝贵时间。 阿兰
返回类型从不用于过载解析。 实际上,您甚至不能声明两个仅在返回类型上不同的函数。 我认为,添加此功能将很复杂,并且没有帮助。 是否需要使用函数调用运算符? 您可以只使用一个命名成员函数,然后给它们指定不同的名称。 另一个选择是使用成员模板,但是即使那样,您仍然需要显式地将返回类型指定为模板参数,并且如果在函数调用运算符上进行操作,语法将很丑陋。
Kerrek SB的评论提出了一种利用转换运算符的解决方法,如果您对内部复杂但外部更简单的东西没问题的话。
#include <iostream>
struct A {};
struct B {};
A fooA_impl(const char *) {
std::cerr << "A impl" << std::endl;
return A();
}
B fooB_impl(const char *) {
std::cerr << "B impl" << std::endl;
return B();
}
class Helper {
public:
operator A() { return fooA_impl(p); }
operator B() { return fooB_impl(p); }
private:
friend Helper foo(const char *p);
Helper(const char *p_) : p(p_) {}
const char *const p;
};
Helper foo(const char *p) {
return Helper(p);
}
int
main() {
A a(foo("hello"));
B b(foo("hello"));
}
您不能按返回类型使用重载。 您可以做的一件事是在重载operator()时将返回类型添加为标记参数:
QByteArray operator()(QByteArray const& data, const QByteArray& tag );
QVector<quint32> operator()(QByteArray const& data, const QVector<quint32>& tag);
下面是调用这些函数的方式:(假设两种类型都有默认构造函数)。
(data, QByteArray());
(data, QVector<quint32>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.