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

答えて

2

元のエラーについては、

私はエラーが

"非名前空間スコープに明示的な特殊" 修正しようとしています

このエラーは、クラス定義内でメンバー関数テンプレートの特殊化を定義できないことを意味します。私。以下では違法であろう:

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

(専門の後者の位置は、「名前空間スコープで」ある:

struct Bar 
{ 
    template <typename T> void boo() { } 
    // template <> void boo<char>() { boo<int>(); } // Error! Cannot specialize here 
}; 

しかしながら、これは単に外部クラス定義特殊を配置することによって解決されます。たとえば、グローバルスコープで、エラーメッセージがあなたに指示したかったものです)。

2

関数テンプレートの完全な特殊化はもはやテンプレートではなく、関数です。

このように、ヘッダーに定義するときは、キーワードinlineを追加する必要があります。

inlineは、C++の "One Definition Rule"(ODR)の動作を変更します。本質的には、inlineを使用すると、関数は’が使用されているすべての変換単位で定義する必要があり、それらの定義は実質的に等しくなければなりません。どちらもヘッダーファイルに定義を配置することで実現します。

inlineも最適化に関するヒントとして役立ちますが、2番目の意味は保証されません。

この回答はあなたを誤解しないので、関数テンプレートの部分的な特殊化などはありません。

関連する問題