簡體   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