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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-04 11:56:11687ブラウズ

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>
<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>
<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。