2015-01-18 2 views
0
#include <vector> 
#include <iostream> 

using namespace std; 

static const int NOT_FOUND = -1; 

template <class sequence, class T> 
int binarySearch(sequence& seq, int low, int high, T& item) 
{ 
    //.. 
} 

template <class sequence, class T> 
int binarySearch(const sequence& seq, const T& item) 
{ 
    if (seq.size() == 0) 
     return NOT_FOUND; 
    return binarySearch(seq, 0, seq.size() - 1, item); 
} 

int main() 
{ 
    vector<int> t1 = {0, 3 ,45, 94}; 
    cout << binarySearch(t1, 0); 
    //binarySearch(t1, 0, t1.size() - 1, 45); 
    return 0; 
} 

왜 컴파일러는 동의하지 않습니다이러한 참조 매개 변수를 const로 선언하거나 값으로 전달해야하는 이유는 무엇입니까?

template <class sequence, class T> 
int binarySearch(sequence& seq, T& item) 

?

는 또한, 왜 언급 컴파일 등의 프로그램,하지만하지 컴파일 주에서

binarySearch(t1, 0, t1.size() - 1, 45); 

를 호출합니까?

어떤 경우에 컴파일러 오류는 " 'binarySearch'에 대한 호출에 대한 일치하는 기능입니다.

+0

't1.size()'를 int로 사용하지 않는 한가지 문제점은 부호없는 값을 반환하기 때문에 먼저 int로 변환 한 다음' int (t1.size()) - 1' – theharshest

답변

2

문제는 당신이 const가 아닌 참조에 임시 객체를 바인딩 할 수 없습니다입니다.

binarySearch(t1, 0); 
       ^---- this is a temporary 

하는 경우 당신은 변수에 0 저장 및 사용의 non-const version would work.

§ 8.5.4

- 그렇지 않으면 T가 참조 유형 인 경우 참조에 대한 초기화의 종류에 따라 T가 참조하는 유형의 임시 prvalue가 사본 목록 초기화 또는 직접 목록 초기화되고 해당 참조가 일시적인. [참고 : 평소처럼 바인딩이 실패하고 참조 유형이 비 const 유형에 대한 좌변점 참조 인 경우 프로그램이 잘못 작성됩니다. -end note

+0

Ah 예 rvalue는 비 const에 바인딩 할 수 없습니다. 명확성을 위해 표준의 관련 섹션이 있습니까? –

+0

@SteveM 이것은 N3936에서 찾을 수있는 유일한 것입니다. – Borgleader

관련 문제