現象
クラス テンプレートのフレンドとして引き関数テンプレートを宣言しようとすると、C++ コンパイラは、コードの代わりにエラー メッセージを返します。たとえば、実行すると次の宣言。
template<typename T>
struct B { };
template<typename... Types>
struct C { };
template<typename... Types, typename U>
void f(C<Types...>, B<U>)
{
}
template<typename T>
class A {
template<typename... Types, typename U>
friend void f(C<Types...>, B<U>);
};
int main()
{
f(C<int>{}, B<int>{});
A<int> a{};
};
次のエラー メッセージが表示される場合があります。
エラー C2783: 'void f (< 種類 > の C、B < U >)': 'U' のテンプレート引数を減少できませんでした
原因
原因は、C++ コンパイラが既存の宣言にフレンド関数の宣言に一致ことはできません。
解決策
Microsoft ダウンロード センターからこの更新プログラムがあります。
Microsoft ダウンロード センター
Microsoft サポート ファイルをダウンロードする方法の詳細については、次の記事番号をクリックして、マイクロソフト サポート技術情報の記事をご参照ください。
119591オンライン サービスからマイクロソフトのサポート ファイルを入手する方法
このファイルは、マイクロソフトによってウイルス スキャン済みです。マイクロソフトは、ファイルが公表された日付に使用可能な最新のウイルス検出ソフトウェアを使用しています。このファイルは、ファイルへの不正な変更を防止するセキュリティが強化されたサーバーに格納されています。
必要条件
この修正プログラムには、Visual Studio の 2015 更新 3 が必要です。
再起動に関する情報
この修正プログラムの適用後、コンピューターの再起動が必要な場合があります。
置き換えに関する情報
この更新プログラムを適用しても、これまでにリリースされた更新プログラムが置き換えられることはありません。
ファイル情報
修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (UTC) で示されています。ファイル情報に表示される時刻は、ローカル時刻に変換されています。UTC とローカル時刻との時差を確認するには、コントロール パネルの [日付と時刻] の [タイム ゾーン] タブを使用してください。
ファイル名 |
ファイル バージョン |
ファイル サイズ |
日付 |
時刻 |
プラットフォーム |
VC14-KB4096429.exe |
14.0.24240 |
19,177,304 |
04/19/2018 |
午前 02時 32分 |
X86 |
回避策
この問題を回避するのには、引き関数テンプレートはクラス テンプレートのフレンドとして宣言をしないでください。