タグ付けされた質問 「incomplete-type」

6
不完全な型のstd :: unique_ptrはコンパイルされません
私はpimpl-idiomをstd::unique_ptr次のように使用しています: class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile }; ただし、次の行304で、不完全な型の使用に関するコンパイルエラーが発生します<memory>。 ' sizeof'の不完全な型 ' uixx::window::window_impl' への無効な適用 私の知る限りstd::unique_ptrでは、不完全な型で使用できるはずです。これはlibc ++のバグですか、ここで何か問題がありますか?

1
Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?
次のクラステンプレートがあるとします。 template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; のInner専門化ごとに個別に定義しますOuter。 template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; 次にf、すべての特殊化についてメンバー関数を1回定義しますOuter。 auto Outer<T>::f(Inner) -> void { } しかしClang(9.0.0)は不平を言います: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ Inner他のすべての特殊化の定義も提供することにより、コンパイラエラーを回避できますOuter。 template<typename T> struct Outer<T>::Inner {}; または、f専門化ごとに個別に定義することにより: template<> auto …

2
Tは `std :: declval <T>`で使用される完全な型である必要がありますか?
この例を見てみましょう(ここから来ます): #include &lt;type_traits&gt; #include &lt;iostream&gt; template &lt;typename U&gt; struct A { }; struct B { template &lt;typename F = int&gt; A&lt;F&gt; f() { return A&lt;F&gt;{}; } using default_return_type = decltype(std::declval&lt;B&gt;().f()); }; int main() { B::default_return_type x{}; std::cout &lt;&lt; std::is_same&lt; B::default_return_type, A&lt;int&gt;&gt;::value; } それはgcc9.2でエラーなしでコンパイルしますが、gcc7.2とclang 10.0.0 Bは完了していないことについて不平を言います。Clangsエラーは: prog.cc:11:58: error: member access into …

1
不完全な型へのポインタは不完全なのでしょうか?
することができint (*)[]、不完全型で? C 2018 6.2.5 1は言う: 翻訳単位内のさまざまな時点で、オブジェクトタイプは不完全(そのタイプのオブジェクトのサイズを決定するのに十分な情報がない)または完全(十分な情報がある)の場合があります。 したがって、型のサイズがわかっていれば、型は完全であるように見えます。6.2.6.1 28は、特定のタイプのポインターは同じサイズ(ポインターvoidと文字、互換タイプへのポインター、構造体へのポインター、および共用体へのポインター)でなければならないことを指定していますが、他のタイプへのポインターは異なる場合があります。 すべてのポインター、またはの配列へのすべてのポインターがint同じサイズであるCの実装では、のサイズint (*)[]がわかっているため、完全なサイズになります。たとえば、大きな配列に異なるポインタを使用する実装では、サイズがわからないため、不完全です。 以下のようにMMが指摘し、構造これは、ポインタのサイズの実装が受け入れなければならないことを示唆している6.7.2.1 3に制約ごとに、最終的な可撓性のアレイメンバーを除き、不完全な型とメンバーを含んではならないstruct { int (*p)[]; }異なる有する実装ながらそのような配列のサイズは、制約違反を診断する必要があります。(これは、そのような宣言が厳密に準拠するCの一部ではないことを意味します。)

1
コンパイラは、暗黙的に宣言された仮想デストラクタの実装を単一の個別の翻訳単位に配置できますか?
次のコードはVisual Studio(2017と2019の両方で/permissive-)でコンパイルおよびリンクしますが、gccまたはでコンパイルしませんclang。 foo.h #include &lt;memory&gt; struct Base { virtual ~Base() = default; // (1) }; struct Foo : public Base { Foo(); // (2) struct Bar; std::unique_ptr&lt;Bar&gt; bar_; }; foo.cpp #include "foo.h" struct Foo::Bar {}; // (3) Foo::Foo() = default; main.cpp #include "foo.h" int main() { auto foo = std::make_unique&lt;Foo&gt;(); …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.