2013-04-30 2 views
1

중첩 네임 스페이스 안에있는 friend 함수로 템플릿 클래스를 만들려고합니다. 모든 네임 스페이스를 제거하거나 모든 템플릿 화를 제거하면 올바르게 작동합니다. 그러나 둘 다 있으면 컴파일되지 않습니다.중첩 네임 스페이스 안에 friend 함수가있는 템플릿 클래스

오류 C2248 :

namespace MyNamespace 
{ 
    // Forward declaration 
    template <typename Type> 
    class Container; 

    // Forward declaration 
    namespace AccessPrivateImplementation 
    { 
     template <typename Type> 
     Type getValue(Container<Type>* container); 
    } 

    // Templatized class 
    template <typename Type> 
    class Container 
    { 
     friend Type AccessPrivateImplementation::getValue(Container<Type>* volume); 
    private: 
     Type value; 
    }; 

    // Friend function inside a namespace 
    namespace AccessPrivateImplementation 
    { 
     template <typename Type> 
     Type getValue(Container<Type>* container) 
     { 
      return container->value; 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    MyNamespace::Container<int> cont; 
    MyNamespace::AccessPrivateImplementation::getValue(&cont); 
    return 0; 
} 

컴파일러 (VS2010)가 나를 알려줍니다의 일부 코드를 살펴 보자 'MyNamespace에 :: 컨테이너 :: 값'MyNamespace에 '클래스에서 선언 private 멤버에 액세스 할 수 없습니다 : : 컨테이너 '

실종 된 사람이 있습니까?

+0

이 Container''전'getValue'를 선언하십시오. – Pubby

+0

이 스레드가 도움이 될 수 있습니다 http://stackoverflow.com/questions/16288446/i-need-help-fixing-an-error-message-error-lnk2019-unresolved-external-symbol/16288486#16288486 –

+0

@Pubby - 고마워, getValue는 Container에 대한 포인터를 사용하기 때문에 두 번째로 올 필요가 있습니다. –

답변

1

Container 클래스 템플릿 내부의 friend 선언 친구 비 템플리트 AccessPrivateImplementation 네임 스페이스에 살고 기능 getValue()를 선언합니다.

그러나 이러한 기능을 제공하지 않았습니다. 대신 AccessPrivateImplementation 네임 스페이스에있는 함수는 템플릿이며 friendContainer<T> (주어진 T 인 경우)이되도록 적절하게 특성화하려고합니다.

는이를 위해, 당신이 필요로하는 선언은 다음과 같습니다

여기
friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume); 
//            ^^ 

이 코드는 위의 수정과 컴파일을 보여줍니다 live example이다. 내 의견으로 당

+0

설명 및 샘플 코드 주셔서 감사하지만 실제로 내 경우에는 (동일한 오류 메시지) 문제를 해결하지 않습니다. 그 웹 사이트는 Clang을 사용하는 것으로 보이므로 VS2010 문제 일 수 있는지 궁금합니다. 나는 그것을 시도하고 그것을 해결할 것이다 ... –

+0

@DavidWilliams : VC10에 문제가있을 수있다, 그렇다. –

+0

저는 VS2010이 약간 짜증이 날 것이라고 생각합니다. 앞에서 언급했듯이 네임 스페이스를 제거하면 VS2010에서 컴파일되며 사용자의 설명에 따라 이해가되지 않습니다. 이 작업은 Clang에 도움이되지 않습니다. 나는이 문제를 해결해야하지만 도움을 주셔서 감사합니다. –

1

, 당신이 좋아하는 friend를 선언하는 경우 그래서 작동합니다

friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume); 
               ^^ 
+0

나는 이것을 시도했지만 여전히 작동하지 않습니다. (같은 오류 메시지) ... 다른 대답이 똑같은 것을 말하기 때문에 나는 당신을 믿고 싶습니다. 다른 답변은 Clang에서 컴파일하는 것처럼 보이는 코드를 제공하므로 VS2010 특정 문제인지 궁금하네요. –

+0

@DavidWilliams VS2010이 없지만 VS에 문제가있는 것은 처음이 아닐 것입니다. Andy도 알고 있다면 물어볼 것입니다. –

관련 문제