2012-03-17 4 views
0

this post에 설명 된 방법을 사용하여 "네임 스페이스가 아닌 범위에서 명시 적 특수화"오류를 수정하려고합니다. 그래서 템플릿 화 된 함수를 별도의 네임 스페이스로 옮길 수 있었고 클래스에서 이러한 함수를 호출하고 있습니다 (아래 코드 참조).네임 스페이스에 대한 링커 오류가 여러 번 포함되었습니다.

코드가 컴파일되지만 네임 스페이스의 모든 함수에 대해 "main.obj에서 이미 정의 된"링커 오류가 발생합니다. 상단에 #ifndef STYLE_H을 추가하면 네임 스페이스가 여러 번 포함되지 않거나 뭔가 빠졌을 것이라고 생각했습니다. 이 오류를 수정하려면 어떻게해야합니까? 다음은

은 (간체) 내 코드입니다 : 원래 오류에 관한

#ifndef STYLE_H 
#define STYLE_H 

namespace hanzi { 

namespace styleUtil { 

    template <class T> 
    T get(const QString& name, T defaultValue = T(), const Style* style = NULL, const Style* baseStyle = NULL) {  
     // ... 
    } 

    template <> 
    QColor get<QColor>(const QString& name, QColor defaultValue, const Style* style, const Style* baseStyle) { 
     // ... 
    } 

    template <> 
    ImagingEffect get<ImagingEffect>(const QString& name, ImagingEffect defaultValue, const Style* style, const Style* baseStyle) { 
     // ... 
    } 

} 

class Style : public QObject { 

    Q_OBJECT 

public: 

    explicit Style(const QString& filePath); 

    template <class T> 
    T get(const QString& name, T defaultValue = T()) const { 
     return styleUtil::get<T>(name, defaultValue, this, baseStyle_); 
    }; 

}; 

} 

#endif // STYLE_H 
+0

오류에서 "네임 스페이스"라는 단어는 사용자의 생각을 의미하지 않습니다. 대신 "클래스 정의에 특수화를 추가 할 수 없습니다"라고 읽어야합니다. –

+0

@Laurent Style의 선언을 놓치셨습니까? – selalerer

답변

2

,

내가 "비 네임 스페이스 범위에 명시 적으로 전문화"를 해결하기 위해 노력하고있어 오류

이 오류는 클래스 정의 내에서 멤버 함수 템플릿 전문을 정의 할 수 없다는 것을 의미합니다. 나는. 다음은 불법이 될 것입니다 :

그러나,이 단순히 외부 클래스 정의 전문화 을 배치하여 해결
struct Bar 
{ 
    template <typename T> void boo() { } 
    // template <> void boo<char>() { boo<int>(); } // Error! Cannot specialize here 
}; 

: "네임 스페이스 범위에서"

template <> void Bar::boo<char>() { boo<int>(); } // Good. 

(전문화의 후자의 위치입니다 예를 들어 전역 범위에서 오류 메시지가 표시하려고했던 것입니다.)

2

함수 템플릿의 완전한 특수화는 더 이상 템플릿이 아닙니다. 이것은 함수입니다.

마찬가지로 헤더에 정의 할 때 inline 키워드를 추가해야합니다.

inline은 C++의 "One Definition Rule"(ODR)의 동작을 변경합니다. 본질적으로 inline을 사용하면 함수는 ’이 사용되는 모든 변환 단위에서 정의되어야하며 이러한 정의는 실질적으로 동일해야합니다. 둘 다 정의를 헤더 파일에 배치하여 수행됩니다.

inline도 최적화에 대한 힌트가되지만 두 번째 의미는 보장되지 않습니다.

또한이 대답이 사용자를 오도하지 않으므로 함수 템플릿의 부분 특수화 같은 것은 없습니다.