繁体   English   中英

编译错误:重载operator()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM