私はSVNのGCCでliteという概念を試してきました。私は、私の理解が不足していると思われる問題にぶつかりました。誰かが私を正しい方向に向けることができれば感謝します。私のコードは次のとおりです。ここで 概念と宣言の順序
#include <iostream>
#include <string>
// Uncomment this declaration to change behaviour
//void draw(const std::string&);
template <typename T>
concept bool Drawable() {
return requires (const T& t) {
{ draw(t) }
};
}
void draw(const std::string& s)
{
std::cout << s << "\n";
}
int main()
{
static_assert(Drawable<std::string>()); // Fails
}
私はタイプ
const T&
のパラメータ、機能
draw(t)
コンパイルを与えることを要求することを意図しているシンプルなコンセプト、
Drawable
を定義します。
次に、cout
に文字列を "描画"する関数draw(const std::string&)
を定義します。最後に、static_assert
が呼び出されたときに、適切なdraw()
関数が有効なので、がDrawable
のコンセプトと一致するかどうかを確認します。
draw(const std::string&)
の前に宣言が含まれていなければ、静的なアサートは失敗します。の概念定義がありません。理由はわかりません。
これはコンセプト上の動作ですか、何か間違っていますか?
何百ものダブがあるBog標準のADL問題。関連する型のどれもメンバーではないため、ADLはグローバル名前空間を検査しません。テンプレートの上の宣言のコメントを外すと、unqualified-name-lookupがテンプレート定義コンテキストでそれを見つけることができます。 – Columbo
したがって、彼が名前空間stdにそのvoid draw宣言を置くと、それは動作するはずです。 – West
開始文にSVNリファレンスがありません。それはどんな意味でも重要なのでしょうか? –