2013-12-12 88 views
1

當OpenCV庫有一個GCC錯誤聲明引用引用類型

typedef const _InputArray& InputArray; 

在我們的代碼,我們有以下函數定義:

void wimshow(const String& winName, InputArray &img) { 

當編譯此出現以下錯誤:

error: cannot declare reference to 'cv::InputArray {aka const class cv::_InputArray&}' void wimshow(const String& winName, InputArray &img) {

怪異THI ng是這個錯誤只發生在Cray環境中使用GCC 4.8.1。使用GCC 4.8.1在正常的Linux環境下編譯無誤。
乍一看,我會說參考類型的引用無論如何不是很有意義,但我很好奇可能導致不同編譯器行爲的原因!

回答

5

這似乎是C++ 03/C++ 11的區別。

在C++ 11,額外&(以及const,捎帶)都應該被忽略:

[C++11: 8.3.2/6]:如果一個typedef(7.1.3),類型模板參數(14.3.1)或decltype-specifier(7.1.6.2)表示類型TR,它是對類型T的引用,嘗試創建類型「左值引用cvTR」創建類型「左值參考T,而嘗試創建類型「rvalue reference to cvTR」創建類型TR

[實施例:

int i; 
typedef int& LRI; 
typedef int&& RRI; 
LRI& r1 = i;   // r1 has the type int& 
const LRI& r2 = i;  // r2 has the type int& 
const LRI&& r3 = i; // r3 has the type int& 
RRI& r4 = i;   // r4 has the type int& 
RRI&& r5 = 5;   // r5 has the type int&& 
decltype(r2)& r6 = i; // r6 has the type int& 
decltype(r2)&& r7 = i; // r7 has the type int& 

末端示例]

這裏的相關的例子是r1;雖然typedef int& LRI不正是像你typedef,這個例子相當於由於其已經下降了下面這段話你const

[C++11: 8.3.2/1]:[..]是病態的,除了當CV CV-合格引用通過使用typedef(7.1.3)或模板類型參數(14.3)引入限定符,在這種情況下,cv限定符將被忽略。 [..]

然而,[C++11: 8.3.2/6]措辭並不在C++ 03的存在!事實上,我們可以用下面的示例程序比較兩種語言之間的行爲:

struct T1 {}; 

typedef T1& T2; 

int main() 
{ 
    T1 x; 
    T2& t = x; 
} 

(忽略有關未使用的變量警告)

所以,檢查每個平臺上的編譯標誌,以確保您使用兩個相同的語言。這可能是Cray的默認值是C++ 03,但是您的平臺上的默認值是C++ 11。使用-std=c++03/-std=c++11標誌來指定明確使用哪個標誌。

+0

快速的幫助。我可以看你的答案改變和改善。幹得好! – Callahan

+0

正如你所說的那樣,'-std = C++ 11'不會產生這個錯誤。感謝您的澄清。 – Callahan

+0

@Callahan:Groovy。 :) –

1

對參考文獻(如const const)的引用應該被忽略,以便使元模板編程更容易,因此您在Cray系統上看到的錯誤是一個錯誤。

+0

這就是我沒有考慮到這個錯誤的原因。當使用庫時,實際的typedef不應該成爲我關心的問題,因此實際上可以忽略一個額外的&。 – Callahan