0

好的,我通常能够阅读、理解和修复编译器错误。但是有了这个,我想我需要帮助。

我想有std::basic_string<CustomClass>CustomClass堂课。我不想为它编写自定义的 char_traits 和分配器类,除非绝对必要(即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-like 类型,而 char-like 类型的对象称为 char-like 对象或简称为字符。

CustomClass不是char-like类型,因为它不是 POD 类型,因此它不能存储在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;

正如 Mooing Duck 在评论中建议的那样。

它似乎很可能实际使用std::is_trivially_default_constructible<>,这限制了您的类也必须是可简单构造的。

于 2012-09-05T21:57:22.420 回答
2

简而言之,您不能使用 custom class,因为短字符串优化可能会使用union.

但是,您可以使用enum类型。

正确地做相当多的工作,你确实需要std::char_traits为你的类型实现。

于 2012-09-05T21:58:19.610 回答