我試圖使用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
錯誤中的「名稱空間」一詞並不意味着您的想法。相反,您應該將其讀爲「您無法將特化添加到類定義」。 – 2012-03-17 09:33:40
@Laurent你是否錯過了Style的前瞻性聲明? – selalerer 2012-03-17 09:41:28