下面的例子說明了一個更復雜但並非不一致的問題,我一直試圖優雅地解決。我有一套必須專門化的模板,並且這樣做可以在每個專業化中實現兩個接口中的一個或兩個:可讀和可寫。具體的同時實現了接口,然後使用主要測試: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.
這令我奇怪:我已忽略了一些簡單的?我已經使用[]運算符編譯並運行了這些代碼,並且一切都很好(因爲它應該一直都是)。這似乎是一個特別與這個操作員的行爲有關的問題,這是我不熟悉的一個問題。
在GCC中編譯得很好,猜測它是一個MSVC錯誤。 – Pubby 2012-01-04 03:52:36
我編輯了我原來的文章,因爲我的問題的性質有一些混亂(我的錯,而毫無疑問,瘋狂編輯)。 – 2012-01-04 03:57:26
你是否遇到'int&i = specific(0); i = 1;' – 2012-01-04 04:00:42