2015-01-29 2 views
-3
//myheader.h 

namespace abc{ 
    int func(int x) { return 10 + x;} 
    inline int callfunc(int a){ return func(a); } 
} 


//global.h 

int func(int x){ return 10 + x; } 

, 해결되지 및 인라인 함수가 지금 어떤 장소에서 호출되지 않은 경우에도, 그것은 func(int x)에 대한 모호성을 해결하기 위해 오류를 반환합니다. 인라인 함수가 이미 namespace abc에있는 기존 정의를 사용하지 않는 이유는 무엇입니까?인라인 기능은 모호한 코드를 컴파일 위의 예에서

+0

''inline' 함수는 호출되지 않아도 여전히 컴파일됩니다. * "현재 인라인 함수가 호출되지 않은 경우에도 오류를 반환합니다."* 오해의 여지가있는'inline' 키워드는 않습니다. 해당 기능에 대한 ODR (One Definition Rule)을 억제하는 것만이 보장됩니다. 다른 모든 동작은 컴파일러에 따라 다릅니다. 또한 여기서 제시 한 코드로는 문제를 재현하기에 충분하지 않습니다. ([나를 위해 일한다] (http://ideone.com/ATfldv).) – cdhowie

+0

오류가 {return abc :: func (a); } –

+0

현재 네임 스페이스에 이미있는 함수 정의에서 모호성을 해결하지 않는 이유는 무엇입니까? ? – Srikan

답변

0
  1. 게시 된 코드에서 오류가 재현되지 않습니다. 이러한 헤더는 단일 .cpp 파일에 포함될 때 문제없이 컴파일됩니다. 따라서 .cpp 파일을 게시해야합니다. .cpp 파일은 헤더가 아니라 실제로 컴파일 된 파일이므로 전체 그림을 얻지 못합니다.
  2. 당신의 인상뿐만 아니라 실제 오류도 게시해야합니다. 귀하의 설명으로 우리는 컴파일러 오류 또는 링커 오류인지 확실하지 않습니다.

그럼에도 불구하고 문제에 대한 몇 가지 가능한 해결책을 제안하겠습니다.

  1. 시도는 FUNC에 호출 네임 스페이스를 지정합니다 :

    inline int callfunc(int a){ return abc::func(a); }

  2. 당신은 정말 당신이 포함하는 경우 당신은 링커 오류를 얻을 수 있습니다, 헤더에 인라인이 아닌 함수를 정의하지 않아야 당신의 두 개 이상의 .cpp 파일에있는 헤더.
    따라서 정의를 .cpp로 유지하고 .h 파일의 선언 만이 그대로 유지해야합니다.