2013-03-03 4 views
0

Я меняю компилятор из Visual Studio на g ++ и имею некоторые проблемы с передачей по ссылке в аргументах функции.Rvalue ссылки в g ++

В Visual Studio, функция:

void Foo(int&a, int&b) 

Так что, б модифицируются в этой функции. Поэтому я не могу использовать в г ++

void Foo(const int&a, const int &b) 

А также Rvalue ссылка не допускается в моем г ++:

void Foo(int&& a, int&& b) 

Так использует указатель является единственным способом, чтобы преобразовать код?

void Foo(int* a, int* b) 

P/S: Это ошибка при компиляции с г ++:

error: no matching function for call to ‘Steerable::buildSCFpyrLevs(Tensor<double, 2ul>, std::vector<Tensor<double, 2ul> >&, int&, int&, int&, bool&)’ 
Steerable.cpp:63:100: note: candidate is: 
Steerable.h:93:7: note: void Steerable::buildSCFpyrLevs(Steerable::data_ref, std::vector<Tensor<double, 2ul> >&, int, int, int, bool) 
Steerable.h:93:7: note: no known conversion for argument 1 from ‘Tensor<double, 2ul>’ to ‘Steerable::data_ref {aka Tensor<double, 2ul>&}’ 

И заявления функции являются:

typedef Tensor<value_type,2> data_type; 
typedef data_type& data_ref; 


vector<Steerable::data_type>& Steerable::buildSCFpyr(Steerable::c_data_ref im, int nLevel, int nDir, int twidth, bool subsample) 

линия, которая имеет ошибку:

buildSCFpyrLevs(imdft.FreqComplexFilter(toComplex(lo0mask)),pyr_freq,nLevel,nDir,twidth, subsample); 
+4

Почему не первая работа? – chris

+0

Er, что вы пытаетесь сделать? Преобразовать код *, чтобы сделать что? – GManNickG

+0

Что касается второго, я думаю, вы могли бы использовать 'const int &'. В противном случае вам также придется изменить вызывающий код –

ответ

1

FreqComplexFilter, вероятно, не возвращается по ссылке.

Грязный фикс:

Tensor<double, 2> tempVal = imdft.FreqComplexFilter(toComplex(lo0mask)); 
buildSCFpyrLevs(tempVal, pyr_freq, nLevel, nDir, twidth, subsample); 

Это грязная, потому что он просто делает код компилируется, он не решает основной проблемы проектирования (Возникает вопрос: почему buildSCFpyrLevs модифицирует временное значение, возвращаемое FreqComplexFilter).

+0

Спасибо, что это работает! Можете ли вы объяснить больше, почему, когда я помещаю всю функцию в buildSCFpyrLevs, она не работает? –

+1

@DzungNguyen Я не совсем уверен в внутренней работе компиляторов, но я знаю, что 'FreqComplexFilter' неявно возвращает временное значение (временное, поскольку его область ограничена выражением), и что передача временного значения по ссылке должна быть избегайте, когда это возможно, поскольку [это может привести к неожиданному поведению] (http://www.cplusplus.com/forum/general/44221/), а g ++, на мой взгляд, хорош. – Dukeling

Смежные вопросы