2012-01-04 69 views
8

下面的例子說明了一個更復雜但並非不一致的問題,我一直試圖優雅地解決。我有一套必須專門化的模板,並且這樣做可以在每個專業化中實現兩個接口中的一個或兩個:可讀和可寫。具體的同時實現了接口,然後使用主要測試:C++運算符()和'using'聲明:左操作數必須是l值錯誤

class Readable 
{ 
protected: 

    int values[3]; 

public: 

    Readable() 
    { 
     // Does nothing. 
    } 

    int operator()(int i) const 
    { 
     return values[i]; 
    } 
}; 

class Writable : public Readable 
{ 
public: 

    Writable() 
    { 
     // Does nothing. 
    } 

    using Readable::operator(); 
    int& operator()(int i) 
    { 
     return values[i]; 
    } 
}; 

class Specific : public Writable 
{ 
}; 

void write_test(Specific& specific) 
{ 
    // Error C2106: '=' : left operand must be l-value 
    specific(0) = 1; 
} 

int main() 
{ 
    Specific s; 
    write_test(s); 

    return 0; 
} 

代碼在VS 2008,2010上失敗,出現以下:

error C2106: '=' : left operand must be l-value.

這令我奇怪:我已忽略了一些簡單的?我已經使用[]運算符編譯並運行了這些代碼,並且一切都很好(因爲它應該一直都是)。這似乎是一個特別與這個操作員的行爲有關的問題,這是我不熟悉的一個問題。

+0

在GCC中編譯得很好,猜測它是一個MSVC錯誤。 – Pubby 2012-01-04 03:52:36

+0

我編輯了我原來的文章,因爲我的問題的性質有一些混亂(我的錯,而毫無疑問,瘋狂編輯)。 – 2012-01-04 03:57:26

+2

你是否遇到'int&i = specific(0); i = 1;' – 2012-01-04 04:00:42

回答

5

這是一個編譯器錯誤:使用聲明應該工作。要解決此問題,只需使用代表團:

class Writable: public Readable { 
    ... 
    int operator()(int i) const { return Readable::operator()(i); } 
    ... 
}; 

此實現長於實際執行委託給,但它避免了Readable不斷變化,如果版本問題。

+0

謝謝Dietmar,這是我自己做的,似乎是最優雅的工作。儘管如此,它仍然是一種痛苦,似乎是編譯器中的一個小問題(與其他方面相比)。 – 2012-01-04 05:37:23

相關問題