编译错误:重载操作符()

compilation error: overloading operator()

本文关键字:操作符 重载 错误 编译      更新时间:2023-10-16

VisualStudio 2008 (vc++ 9)重载操作符()

的问题

你好社区!

似乎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 =单位)

另一边,下面的声明是有效的:

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>());