ホームページ > バックエンド開発 > C++ > 名前空間外のメンバー関数を明示的に特殊化すると、C コンパイル エラーが発生するのはなぜですか?

名前空間外のメンバー関数を明示的に特殊化すると、C コンパイル エラーが発生するのはなぜですか?

Susan Sarandon
リリース: 2024-12-04 11:56:11
オリジナル
689 人が閲覧しました

Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C   Compilation Error?

非名前空間スコープでの明示的な特殊化

テンプレート クラス CConstraint では、int の Verify メンバー関数の明示的な特殊化がクラスの名前空間の外部で定義されています。これにより、C 標準の違反により g でエラーが発生します。

C 03 §14.7.3/2 によれば、明示的な特殊化は、テンプレートがメンバーである名前空間、またはメンバーの名前空間で宣言する必要があります。

この問題を解決するには、Verify for int を明示的に特殊化します。 CConstraint の名前空間内で宣言する必要があります。これは、次の変更コードを使用して実現できます:

<br>template<typename T><br>class CConstraint<br>{<br>public:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">CConstraint()
{
}

virtual ~CConstraint()
{
}

template <typename TL>
void Verify(int position, int constraints[])
{       
}

template <>
void Verify<int>(int position, int constraints[])
{   
}
ログイン後にコピー

};

さらに、メンバー関数の明示的な特殊化には、それを含むクラスの明示的な特殊化が必要であるため、より良い解決策は、Verify 関数をクラスから別のクラスに移動することです。名前空間:

<br>名前空間の詳細<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">template <typename TL>
void Verify(int position, int constraints[]) { }

template <>
void Verify<int>(int position, int constraints[]) { }
ログイン後にコピー

}

テンプレート
クラスCConstraint
{

// ...

template <typename TL>
void Verify(int position, int constraints[])
{
    detail::Verify<TL>(position, constraints);
}
ログイン後にコピー

};

以上が名前空間外のメンバー関数を明示的に特殊化すると、C コンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:C のテンプレート パラメーターに依存する基本クラスで非修飾名の検索が機能しないのはなぜですか? 次の記事:`tellg()` が時々間違ったファイル サイズを返すのはなぜですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート