2017-01-02 3 views
1

다음 코드는 정상적으로 컴파일됩니다.오버로드시 C++ 컴파일 오류가 발생했습니다.

#include <iostream> 
#include <vector> 
using namespace std; 

class MyClass 
{ 
public: 
    MyClass() 
    { 
     x.resize(2); 
     x[0] = 10; 
     x[1] = 100; 
    } 
    std::vector<int> getValue() 
    { 
     return x; 
    } 
    const std::vector<int>& getValue() const 
    { 
     return x; 
    } 
private: 
     std::vector<int> x; 
}; 


int main() 
{ 

    MyClass m; 
    std::vector<int> y = m.getValue(); 
    for(int i=0; i<y.size(); i++) 
    { 
     std::cout<<y[i]<<std::endl; 
    } 

    const std::vector<int>& z = m.getValue(); 
    for(int i=0; i<z.size(); i++) 
    { 
     std::cout<<z[i]<<std::endl; 
    } 
    return 0; 
} 

그러나, ("CONST"(표준 : : 벡터 getValue을 추가하여 (함수가 객체를 변경하도록되어 있기 때문에) 나는 더 정확한 버전으로 "표준 : : 벡터 getValue()"를 변경할 때) const) 다음 컴파일 오류가 발생합니다.

error: 'const std::vector<int>& MyClass::getValue() const' cannot be overloaded const std::vector<int>& getValue() const 

왜 그렇습니까?

I 당신은 반환 형식 만 다른 동일한 이름을 가진 두 개의 함수를 정의 할 수 없습니다 "GCC 버전 4.8.4 (~ 14.04.3 우분투 4.8.4-2ubuntu1)"

+0

잘 모르겠어요하지만 어쩌면 대가로 & (주소 연산자)를 통과 : CONST 표준 : 및 getValue() const를 { 반환 벡터 을 &엑스; } –

+2

컴파일하지 않는 버전을 게시하십시오. –

+1

@RSahu 첫 번째 코드가 정확합니다. 게시물의 설명 된 변경 사항이 코드 –

답변

5

을 사용했다. 그래서 예를 들어, 다른 이름으로 함수를 정의 :

std::vector<int> getValueCopy() const; 
3

당신이 getValue 모호한 호출을 렌더링 첫 번째 함수에 const를 추가 : 그 두 기능의 차이점은 무엇 :

std::vector<int> getValue() const;  // 1 
const std::vector<int>& getValue() const; // 2 

글쎄, 그들은 반환 값을 제외하고는 동일하지만 대기! C++의 반환 유형에 따라 오버로드 할 수 없습니다! 대부분의 호출은 모호합니다.

std::vector<int> y = m.getValue(); // which one? It can be 1, it can be 2 (std::vector<int> 
            // is not a better match than const std::vector<int>&) 

const std::vector<int>& z = m.getValue(); // same as above 

m.getValue(); // which one? 

또한 두 가지의 차이점은 무엇입니까?

첫 번째 것은 100 % 안전하지만 두 번째 것은 안전하지 않습니다. x에 대한 참조를 저장할 수 있으며 개체가 파괴되면 매달아 참조가됩니다. 그리고 가능하면 두 번째 것을 없애 버리겠습니다.

+0

C++에서는 모호성을 피하기 위해 반환 유형이 다른 함수의 오버로드를 허용하지 않는다는 것을 알고 있습니다. 그러나이 예에서 정말로 모호함이 존재합니까? const std :: vector & z = m.getValue()는 분명히 주소를 반환해야하지만 첫 번째 것은 복사본을 반환해야합니다! – Soo

+0

@Soo 네, 실제로 모호한 점이 있습니다 : rvalue (첫 번째'getValue') * 또는 * 다른 참조 (두 번째'getValue')를 사용하여'const &'를 초기화 할 수 있습니다. 둘 다 가능하며 컴파일러는 호출하려는 호출을 알지 못합니다. 왜냐하면'std :: vector & v = m.getValue()'라고 쓰면 rvalue로 참조를 초기화 할 수 없기 때문에 모호성이 없으므로 두 번째 오버로드가 선택됩니다. – Rakete1111

1

문제는 함수의 정의는 인수의 유형 또는 인수 목록에서 인수의 숫자로 서로 달라야합니다 함수를 오버로드 할 때 개념

과부하 기능을 이해하지 못했다는 것이다.

반환 형식에 의해서만 다른 함수 선언을 오버로드 할 수 없습니다. 당신의 기능에

:이 오버로드 된 함수로 간주되지는 않습니다 그래서는 반환 형식에

가장 좋은 방법은 다를

std::vector<int> getValue() const 

const std::vector<int>& getValue() const 

이 오류를 해결하려면 getValuev2()

에 두 번째 함수 이름을 변경하는 것입니다

또는 함수 중 하나의 인수를 변경하십시오.

당신은 C++에서 오버로드에 대한 자세한 내용을보실 수 있습니다 : https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm

+1

실제로 게시 한 함수는 유효한 오버로드입니다. 후행하는'const'는 모든 차이를 만듭니다. – juanchopanza

+0

@juanchopanza 오버로드 개념에서는 유효하지 않으므로 반환 유형이 다르지만 후행하는 'const'가 모든 차이를 만드는 이유는 무엇입니까? – Oghli

+1

예, 두 가지 기능 *이 반환 유형에서만 다를 수 있음을 의미합니다. – juanchopanza

관련 문제