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
오류에서 "네임 스페이스"라는 단어는 사용자의 생각을 의미하지 않습니다. 대신 "클래스 정의에 특수화를 추가 할 수 없습니다"라고 읽어야합니다. –
@Laurent Style의 선언을 놓치셨습니까? – selalerer