[解決済み] 引数リストに一致する関数テンプレートのインスタンスがない(配列を表示しようとした)。
2022-03-04 17:14:50
質問
これをコンパイルしようとすると
template<typename type,const char* format>__device__ void d_prettyPrintVector(type* v, const unsigned int size)
{
printf("\n ");
for(int i=0; i<size; i++)
printf(format, v[i]);
}
template<> void d_prettyPrintVector<float, "%4.1f ">(float*, const unsigned int);
template<> void d_prettyPrintVector<int, "%2d " >(int*, const unsigned int);
template<> void d_prettyPrintVector<char, "%2d " >(char*, const unsigned int);
template<> void d_prettyPrintVector<bool, "%d" >(bool*, const unsigned int);
というように使用します。
d_prettyPrintVector(dc, blockDim.x);
私は
kernels.cu(104): error: no instance of function template "d_prettyPrintVector" matches the argument list
argument types are: (int *, const unsigned int)
どうしたんですか?
解決方法は?
タイプの使い方が明確でないのでは?
float
,
int
などで、適切な書式文字列を取得します。
のような関数に作り替えることができます。
template <typename type>
void d_prettyPrintVector(type* v, const unsigned int size)
{
printf("\n");
for(int i=0; i<size; i++)
printf(getFormatString<type>(), v[i]);
// ^^^ Get an format string appropriate for the type.
}
関数テンプレートがあれば、それは完全に有効なコードになります。
template <typename type> char const* getFormatString();
は、あなたが興味を持っている型のための特殊化を持っていた。つまり、以下のようにすればよい。
template <typename type> char const* getFormatString();
template <typename type>
void d_prettyPrintVector(type* v, const unsigned int size)
{
printf("\n");
for(int i=0; i<size; i++)
printf(getFormatString<type>(), v[i]);
// ^^^ Get an format string appropriate for the type.
}
template <> char const* getFormatString<float>() { return "%4.1f "; }
template <> char const* getFormatString<int>() { return "%2d "; }
template <> char const* getFormatString<char>() { return "%2d "; }
template <> char const* getFormatString<bool>() { return "%1d "; }
これで、使えるようになりました。
int a[] = {1, 2};
d_prettyPrintVector(a, 2);
float b[] = {1.1f, 2.2f};
d_prettyPrintVector(b, 2);
を問題なく実行できます。
おまけ
そのアイデアを拡張して、ラムダ関数を引数として
d_prettyPrintVector
. ラムダ関数は、単一のユースケースにより適したカスタムフォーマット文字列を返すことができます。
オーバーロード
d_prettyPrintVector
. ラムバ関数を引数に取ることができるものを用意する。
template <typename type, typename Format>
void d_prettyPrintVector(type* v, const unsigned int size, Format format)
{
printf("\n");
for(int i=0; i<size; i++)
printf(format(), v[i]);
}
新しい関数を使って初期関数を実装することもできるので、項目がどのように印刷されるかの詳細を繰り返す必要はありません。
template <typename type> char const* getFormatString();
template <typename type>
void d_prettyPrintVector(type* v, const unsigned int size)
{
d_prettyPrintVector(v, size, [](){return getFormatString<type>();});
}
ここで、これまでのprintの呼び出しに加え
a
と
b
が使えるようになりました。
// Define the format on the fly, using a lambda function.
d_prettyPrintVector(a, 2, []() -> char const* {return "%4d ";});
// Define the format on the fly, using a lambda function.
d_prettyPrintVector(b, 2, []() -> char const* {return "%.6f ";});
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】'cout'は型名ではない
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】std::function と std::bind を使用した場合のテンプレート引数の推論/置換に失敗する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された