0

さて、私は通常、コンパイラのエラーを読み、理解し、修正することができて大丈夫です。しかし、これで、私は助けが必要だと思います。

std::basic_string<CustomClass>どこCustomClassにクラスがあるのか​​知りたいです。どうしても必要な場合を除いて、カスタムのchar_traitsとallocatorクラスを作成したくありません(つまり、使用std::char_traits<CustomClass>したいstd::allocator<CustomClass>場合は可能です)。

CustomClassにコンストラクターがない場合は、正常にコンパイルされます。追加するとすぐにエラーが発生します。

暗黙的に削除されたデフォルトコンストラクターの呼び出し'std::__1::basic_string<CustomClass, std::__1::char_traits<CustomClass>, std::__1::allocator<CustomClass> >::__rep'

    #include <iostream>
    #include <string>
    //#include <vector>

    class CustomClass;

    typedef std::basic_string<CustomClass> InstanceString;
    typedef std::basic_string<int> IntString;

    class CustomClass
    {
    public:
        CustomClass()
            : m_X()
        {
        }

        CustomClass(const int x)
            : m_X(x)
        {
        }

    private:
        int     m_X;
    };

    int main(int argc, const char * argv[])
    {
        // This compiles fine
        IntString s1({1, 2, 5});

        // This would compile fine if there were no explicit constructors in Instance
        //InstanceString s2e = InstanceString({Instance(), Instance(), Instance()});

        // This generates errors
        InstanceString s2 = InstanceString({CustomClass(1), CustomClass(3), CustomClass(5)});

        std::cout << "Hello, World!\n";
        return 0;
    }

これはおそらく、暗黙的/明示的なコンストラクター、コピー/移動セマンティクスなどに関係していることを理解しています。

私の質問は:

  • コンパイルするにはどうすればよいですか(つまり、クラスに追加するコンストラクター/何か)
  • そして、これらのタイプのコンパイルエラーを修正する方法を体系的に理解するにはどうすればよいですか?
4

3 に答える 3

4

右から、文字列ライブラリの説明の最初の文[strings.general]/1

この節では、非アレイPODタイプのシーケンスを操作するためのコンポーネントについて説明します。この節では、そのような型はcharのような型と呼ばれ、charのような型のオブジェクトはcharのようなオブジェクトまたは単に文字と呼ばれます。

CustomClasschar-likePODタイプではないためタイプではなく、その結果、に格納することはできませんbasic_string

libc++実装は、短い文字列の最適化を使用しているため、コンパイルに失敗しています。そうすることで、カスタムコンストラクターを提供しなくても、配列をユニオンに保持できると想定していますCharT

于 2012-09-05T21:57:41.863 に答える
2

あなたが言ったように、エラーメッセージは言う

Call to implicitly-deleted default constructor of 'std::__1::basic_string, std::__1::allocator >::__rep'

__repここにあなたがいると確信していますCustomClass。デフォルトのコンストラクターを呼び出そうとしていると言っていますが、それは暗黙的に削除されています(独自のコンストラクターを提供することにより)。basic_stringを使用していると思いますstd::is_default_constructible<>。そのため、を使用してデフォルトのコンストラクターを提供する必要があります

CustomClass() = default;

MooingDuckがコメントで示唆したように。

実際にはを使用している可能性がstd::is_trivially_default_constructible<>あります。これにより、クラスも簡単に構築できる必要があるという制限が課せられます。

于 2012-09-05T21:57:22.420 に答える
2

classつまり、短い文字列の最適化では。が使用される可能性があるため、カスタムを使用することはできませんunion

ただし、enumタイプは使用できます。

適切に行うのはかなりの作業でありstd::char_traits、タイプに合わせて実装する必要があります。

于 2012-09-05T21:58:19.610 に答える