在OpenCV库中有一个
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) {
奇怪的是,只有在Cray环境中使用GCC 4.8.1才会出现此错误。在具有GCC 4.8.1的普通Linux环境中进行编译可以正常工作 乍一看,我会说对引用类型的引用无论如何都不是很有意义,但我很好奇什么可能导致不同的编译器行为!?
答案 0 :(得分: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
“,而尝试创建” cvTR
的rvalue引用“会创建类型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&
-end example]
此处的相关示例是r1
;虽然typedef int& LRI
与您的typedef
不完全相同,但由于以下段落已经删除了const
,因此示例相同:
[C++11: 8.3.2/1]:
[..] 除非通过使用typedef(7.1.3)或模板引入cv限定符,否则Cv限定引用的格式不正确type argument(14.3),在这种情况下,将忽略cv限定符。 [..]
但是,C ++ 03中不存在[C++11: 8.3.2/6]
措辞!实际上,我们可以使用以下示例程序比较两种语言之间的行为:
struct T1 {};
typedef T1& T2;
int main()
{
T1 x;
T2& t = x;
}
error: cannot declare reference to 'T2 {aka struct T1&}'
(忽略有关未使用变量的警告)
因此,请检查每个平台上的编译标记,以确保您在两个平台上使用相同的语言。可能是Cray上的默认值是C ++ 03,但是你平台上的默认值是C ++ 11。使用-std=c++03
/ -std=c++11
标志来明确明确使用哪个。
答案 1 :(得分:1)
对引用的引用(作为const const
)应该被忽略,以使元模板编程更容易,因此您在Cray系统上看到的错误是一个错误。