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スタイルの前方宣言がありませんか? – selalerer