問題タブ [function-templates]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - クラステンプレートのフレンド関数
クラステンプレートがありFoo<T>
ます。
Bar
2つのsを取りFoo
、を返す非メンバー関数を実装したいと思いますFoo
。発信者が書くよりもBar
自然になるので、私は非会員になりたいです。計算が簡単で頻繁なので、私もなりたいです。Bar(f1, f2)
f1.Bar(f2)
Bar
inline
秘訣は、のプライベートデータBar
にアクセスする必要があることです。Foo
プライベートデータへのアクセサーを持たない方がいいです。プライベートデータをユーザーに公開する正当な理由はありません。Bar
だから私はの友達を作りたいですFoo
。
ここで私は問題にぶつかります。コンパイラは文句を言います:
フレンド宣言が関数テンプレートの特殊化を参照している場合、インライン指定子は使用できません。
このルールは標準によって課されていますか、それともMSVC ++に固有ですか?
これが私が試したことです:
const
Bar
public member関数を作成してから、単に。を返す非メンバーバージョンを宣言しますlhs.Bar(rhs)
。これは最もハッキーな解決策のようです。inline
コンパイラがヒントに関係なくインライン化を決定することを知って、ヒントを削除します。次に、これは単一定義規則に違反しますか?関数テンプレートであるため、ヘッダーファイルで定義する必要があります。ダミーのテンプレートタイプを使用してメンバー関数を宣言します。
/li>
なぜそれが機能するのか完全にはわかりませんが、コンパイラーは満足しています。
より良い解決策はありますか?
c++ - 戻り値の型が T の関数テンプレートがコンパイルされない
次のコードは正常にコンパイルされます。
ideone でコンパイル成功: http://ideone.com/dR6iZ
しかし、戻り値の型について言及すると、コンパイルされません。
今ではエラーが発生します:
prog.cpp:6: エラー: 'f(const char [21])' の呼び出しに一致する関数がありません</p>
ideone のコード: http://ideone.com/b9aSb
戻り値の型const T
にしてもコンパイルされません。
私の質問は:
- なぜコンパイルされないのですか?
- 戻り値の型は、エラーと関数テンプレートのインスタンス化にどのような関係がありますか?
c++ - あいまいなエラー: テンプレート C++
考えられるほとんどすべてのことを試しましたが(もちろん正しいことは別として)、あいまいなエラーが発生する理由がまだわかりません。私はそれが本当にばかげたことだとかなり確信していますが、私はそれを見ることができません! 私のコンパイラは挿入演算子で警告を表示し、それらが両方とも呼び出されていることを知っていますが、古いものに固執するvirtual
とそこに役立つと言われました(そしてそうではありません...)、とにかくまだ!
呼び出し時のエラーcout << endl << accType;
ProduceReport.cpp:16: error: ambiguous overload for 'operator<<' in 'std::cout. std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](std::endl [with _CharT = char, _Traits = std::char_traits<char>]) << accType'
エラーメッセージです。
このエラーを回避する方法について、ヘルプやヒントをいただければ幸いです。
templates - テンプレート関数の「一致する関数呼び出しがありません」
テンプレート関数を記述しようとすると、次のエラーが発生し続けます。
エラーを検索したところ、パラメーターが float または double の場合に型以外のテンプレート パラメーターが問題になる可能性がある他のケースがいくつか見つかりました。size_t
行列とベクトルのサイズを決定するために、タイプのないテンプレート パラメータを使用しています。
私は次のクラスを持っています:
マトリックス:
ベクター:
私の機能:
から呼び出されます:
gcc バージョン 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
d - D関数テンプレートと型推論
次のコードを検討してください。
consume
今、私はコンパイラがそれがインスタンス化されることを推測することを期待しています
しかし、それは起こらないようです。エラーは次のとおりです。
パラメータタイプが正しいことがわかります...次のような関数シグネチャのバリエーションをいくつか試しました。
これもコンパイルされません(引数の順序を変更するというアイデアでした)、そして
これは、型をコンパイルして推測します。呼び出しでタイプを明示的に指定した場合、つまり
また、期待どおりにコンパイルされ、デバッグwriteln
が出力char
されます。推論規則に何かが欠けているのですか、それともコンパイラのバグにぶつかっただけですか?
そうそう:
c++ - 関数に特化したC++テンプレート
テンプレートの特殊化で遊んでいますが、解決できないと思われる問題を見つけました。これは私のコードです:
だから私がやろうとしているのは、テンプレートで処理されるものの長さを渡すことです。
問題は、これをコンパイルすると、永久に出力されることです。
最後の2行は、最初の行とほとんど同じです。
私には、専門分野を捉えていないように思われるので、次のようになります。
私は正しいですか?
そして、私が正しければ、部分的なテンプレートの特殊化が関数テンプレートに許可されていないという問題だと思います。それでは、構造体を作成し、それに特殊化を使用することで、どのような解決策がありますか?
c++ - C ++のテンプレート関数で通常のパラメーターとテンプレートパラメーターを渡す方法は?
myNamespaceという名前空間に(次のように)テンプレート関数があります。
ただし、この関数を呼び出すと、次のエラーが発生します。
私はすべての組み合わせを試しましたが、運がありません、助けてください!!!
c++ - 非型関数テンプレートパラメーター
私はC++Templates Complete Guideを読んでいて、この非型関数テンプレートパラメーターコードに出くわしました(関数定義と呼び出しを除くmain()と他の部分を追加しました):
本を読んだ後、なぜ関数呼び出しの型キャストが必要なのか理解できませんでしたか?
編集:本からの説明:
addは関数テンプレートであり、関数テンプレートは、オーバーロードされた関数のセットに名前を付けると見なされます(セットにメンバーが1つしかない場合でも)。ただし、現在の標準によれば、オーバーロードされた関数のセットをテンプレートパラメータの推定に使用することはできません。したがって、関数テンプレート引数の正確なタイプにキャストする必要があります:...
コンパイラ:Ubuntu10.10のg++ 4.5.1
c++ - 関数テンプレートで(ブースト)バインドを使用できますか?
(ブースト)バインドを使用して引数を関数テンプレートにバインドすることは可能ですか?
アイデア?