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