2014-03-25 2 views
1

내가 정적 데이터 멤버와 템플릿 클래스를 구축하기 위해 노력하고있어 나는 다음과 같은 코드를 컴파일 할 때이 오류 메시지가 :명시 적 인스턴스화 ...하지만 사용할 수없는 정의 [-fpermissive]

|In instantiation of ‘T<int>& T<int>::t’:| 
16|required from here| 
16|error: explicit instantiation of ‘T<int>::t’ but no definition available [-fpermissive]| 
|In instantiation of ‘T<int>& T<int>::t’:| 
16|required from here| 
16|error: explicit instantiation of ‘T<int>::t’ but no definition available [-fpermissive]| 
||=== Build finished: 2 errors, 4 warnings (0 minutes, 0 seconds) ===| 
을 합니다 (보여 문제에 증류수.)

코드

template <class A> 
class T { 
private: 
    static T&  t; 
public: 
    T& getT() {return t;} 
}; 

T<int> i; 
template T<int>& T<int>::t; 

int main() 
{ 
    i.getT(); 

    return 0; 
} 

내가 무엇을 의미하는지 이해가 안 무서워 "사용할 수없는 정의." 나는 "템플릿 T & T :: t;"라고 생각했다. 정적 데이터 멤버를 정의합니다.

나는 리눅스에서 GCC를 사용하고 있습니다 : 어떤 도움

[email protected]:~$ c++ --version 
c++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 
Copyright (C) 2013 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

감사합니다!

편집 : 정적 멤버의 선언을 참조로하는 것이 분명히 오류이며이를 수정했습니다.

여러 가지 해결책과 제안을 보내 주셔서 감사합니다. 나는 그 (것)들을 공부하고 어느 것이 가장 적합한 지 결정해야 할 것이다.

FWIW, 내가 계획하고있는 것은 단일 연결 목록을 다시 작성하는 것입니다. 대상은 Arduino이며 제한된 리소스로 코드 및 RAM 크기에 민감합니다. 그렇지 않으면 STL 컨테이너를 사용하는 것이 행복 할 것입니다. 단일 링크 된 목록을 코딩 중이며 정적 데이터 멤버가 목록 머리를 가리키는 센티널이됩니다. 목록의 마지막 요소는 감시 카메라를 가리 킵니다. 첫 번째 반복에서는 상속을 사용하여이 글을 쓰기 시작했지만 곧 다양한 파생 클래스에 대한 공통 코드가 없다는 것을 알게되었습니다. (그들은 개념 상 유사점을 공유하지만 구현으로 번역되지 않았다. 예를 들어, 그것들은 별개의 목록과 독특한 처리법을 가졌기 때문에 상속은 초기 선택이 좋지 않은 듯했다.)이 어려움은 템플릿이 마찬가지로 좋지 않다는 신호가 아니길 바란다. 선택.

+0

조금 벗어난 주제 : 여기에 나와있는 것은 비교적 단단한 결합을 유도하기 때문에 조심해서 사용해야하는 싱글 톤입니다. 싱글 톤은 요즘 코드 냄새 (또는 디자인 냄새)로 간주됩니다. 그것은 템플릿이라는 것을 보여 주므로 하나 이상의 냄새를 맡을 계획입니다. 구현 방법은 스레드 세이프가 아니므로 "Meyers Singleton"을 찾아야 할 수도 있습니다. –

+0

그럼에도 불구하고 주제에서 벗어나지 만 유용합니다. 나는 당신이 Effective C++에서 그 언급을 언급하고 있다고 추정한다. 나는 그것을 볼 것이다. 나는 여기에 특정 오류가 궁금하지만 다른 솔루션을 열어. – HankB

+0

글쎄, 당신이 제공 한 증류 된 코드에서 싱글 톤으로 해결하려고 시도한 것은 컴파일러 오류에 관한 것이므로 ok입니다. 싱글 톤을 사용하는 데싱 문제를 해결하기위한 대안에 관심이 있다면, 다른 싱글 질문을 열고, 현재 싱글 톤을 사용하는 컨텍스트와 현재 디자인을 살펴보십시오. –

답변

0

나는 템플릿에 특히 유용 클래스에서 싱글을위한 간단한 방법을 제안 :

template <class A> 
class T { 
public: 
    static T& getT() { 
     static T t; 
     return t; 
    } 
}; 

이 방법 당신은 별도의 정의가 필요하지 않습니다. 많은 경우 템플리트는 머리말 전용이고 정의를위한 소스 파일이 없으므로 매우 편리합니다.

그렇지 않으면 당신은 당신의 선언에 &을 삭제해야합니다

template <class A> 
class T { 
private: 
    static T  t; 
public: 
    T& getT() {return t;} 
}; 

T<int> i; 
template<> T<int> T<int>::t; 

을 그리고 링커 오류를 방지하기 위해, 당신은 정적 변수에 뭔가를 할당해야합니다.

template<> T<int> T<int>::t = T<int>(); // for example 
+0

예, 참조에 대한 선언이 분명히 잘못되었습니다. 귀하가 제공하는 구체적인 해결책이 효과가 있습니다. 원본 게시물에 추가 정보 (TMI 경계)가 추가되었습니다. – HankB

1

정적 멤버의 정의가 잘못되었습니다. 당신은 모든 T를 위해, 그것에게 템플릿 방법을해야 하나 :

template <class A> T<A>& T<A>::t = /* ??? */; 

또는 단지의 int에 대한 전문성 등 :

template<> T<int>& T<int>::t = /* ??? */; 

후자의 문제와 함께 당신을 떠날 것이다 다른과 T의 인스턴스 int보다 type은 그러한 인스턴스화의 정적 멤버를 정의 할 것을 요구합니다.

정적 멤버가 참조 인 경우 스 니펫에 ???으로 표시된 일부 개체를 바인딩해야합니다. 정적 멤버를 참조 대신 T<A>의 객체로 만들면 해당 문제가 해결됩니다.

1

나는 이전의 대답은 당신이 이 정말로 필요로하는 해결책을 제공한다고 생각한다.. 이 코드에 객체 유형 T<A>참조 대신 정적 변수로 사용되는

template <class A> 
class T 
{ 
private: 
    static T t; 
public: 
    T& getT() {return t;} 
}; 

// definition of a static variable 
template <class A> 
T<A> T<A>::t; 

// explicit instantiation of a static variable for template argument `int` 
template T<int> T<int>::t; 

참고 : 당신의 실제 목표 명시 적 인스턴스화를 사용할 수 있다면 다음과 같이 그러나 그것을 달성 할 수있다 그것에.

+0

예, 참조가 잘못되었습니다. 정의와 인스턴스화에 대한 코드를 제공해 주셔서 감사합니다. – HankB

관련 문제