この投稿で説明されている方法を使用して、「名前空間以外のスコープでの明示的な特殊化」エラーを修正しようとしています。そのため、テンプレート化された関数を別の名前空間に移動し、クラスからこれらの関数を呼び出しています(以下のコードを参照)。
コードがコンパイルされるようになりましたが、名前空間内のすべての関数に対して「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