尝试使用initializer_list初始化类的成员值时编译错误

电子

我正在尝试从类构造函数的构造函数的初始化列表中的initialization_list初始化一个类。它适用于std :: map,但不适用于我的自定义类。除了在std :: map中使用模板之外,我没有看到其他任何区别。

#include <iostream>
#include <initializer_list>

#include <string>
#include <sstream>
#include <map>
using std::string;

class text_thing
{
private:
    string m_text;

public:
    text_thing()
    {

    }

    text_thing(text_thing& other);
    text_thing(std::initializer_list< std::pair<const string, const string> >& il);

    text_thing& operator=(std::initializer_list< std::pair<const string, const string> >& il);

    operator string()
    {
        return m_text;
    }

};


class static_base
{
private:
    std::map<string, string> m_test_map;
    text_thing m_thing;

    static_base();


public:
    static static_base& getInstance()
    {
        static static_base instance;
        return instance;
    }

    string getText()
    {
        return (string)m_thing;
    }

};


typedef std::pair<const string, const string> spair;

text_thing::text_thing(text_thing& other)
{
    m_text = other.m_text;
}

text_thing::text_thing(std::initializer_list< std::pair<const string, const string> >& il)
{
    std::stringstream text_gen;
    for (auto& apair : il)
    {
        text_gen << "{" << apair.first << ", " << apair.second << "}" << std::endl;
    }
}

text_thing& text_thing::operator=(std::initializer_list< std::pair<const string, const string> >& il)
{
    std::stringstream text_gen;
    for (auto& apair : il)
    {
        text_gen << "{" << apair.first << ", " << apair.second << "}" << std::endl;
    }

    return *this;
}

static_base::static_base() :
        m_test_map{{"test", "1"}, {"test2", "2"}},  // Compiler fine with this
        m_thing{{"test", "1"}, {"test2", "2"}}      // Compiler doesn't like this
{

}

int main()
{

    std::cout << "Starting the program" << std::endl;

    std::cout << "The text thing: " << std::endl << static_base::getInstance().getText();

}

我得到这个编译器输出

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"static_base.d" -MT"static_base.d" -o "static_base.o" "../static_base.cpp"
Finished building: ../static_base.cpp

Building file: ../test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"test.d" -MT"test.d" -o "test.o" "../test.cpp"
../test.cpp: In constructor ‘static_base::static_base()’:
../test.cpp:94:40: error: no matching function for call to ‘text_thing::text_thing(<brace-enclosed initializer list>)’
   m_thing{{"test", "1"}, {"test2", "2"}}
                                        ^
../test.cpp:94:40: note: candidates are:
../test.cpp:72:1: note: text_thing::text_thing(std::initializer_list<std::pair<const std::basic_string<char>, const std::basic_string<char> > >&)
 text_thing::text_thing(std::initializer_list< std::pair<const string, const string> >& il)
 ^
../test.cpp:72:1: note:   candidate expects 1 argument, 2 provided
../test.cpp:67:1: note: text_thing::text_thing(text_thing&)
 text_thing::text_thing(text_thing& other)
 ^
../test.cpp:67:1: note:   candidate expects 1 argument, 2 provided
../test.cpp:23:2: note: text_thing::text_thing()
  text_thing()
  ^
../test.cpp:23:2: note:   candidate expects 0 arguments, 2 provided
make: *** [test.o] Error 1

gcc -v的输出

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.1-2ubuntu1~13.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu                                                                                                                                                                                                     
Thread model: posix                                                                                                                                                                                                                                                            
gcc version 4.8.1 (Ubuntu 4.8.1-2ubuntu1~13.04) 

使用这种方式构造的std :: map可以很好地进行编译,如果我修改static_base以从地图中返回字符串,那么一切都很好而且很花哨。

请帮助我了解这里的情况。

凯西

std::initializer_list通过值传递,而不是通过引用传递。将您的text_thing构造函数和赋值运算符更改为按值而不是引用接受(Coliru直播):

class text_thing
{
    // snip other stuff

    text_thing(std::initializer_list< std::pair<const string, const string> > il);
    text_thing& operator=(std::initializer_list< std::pair<const string, const string> > il);
};

text_thing::text_thing(std::initializer_list< std::pair<const string, const string> > il)
{
    std::stringstream text_gen;
    for (auto& apair : il)
    {
        text_gen << "{" << apair.first << ", " << apair.second << "}" << std::endl;
    }
}

text_thing& text_thing::operator=(std::initializer_list< std::pair<const string, const string> > il)
{
    std::stringstream text_gen;
    for (auto& apair : il)
    {
        text_gen << "{" << apair.first << ", " << apair.second << "}" << std::endl;
    }

    return *this;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试初始化结构向量时出现编译错误

来自分类Dev

使用直接初始化与std :: initializer_list时的不同指令

来自分类Dev

初始化LinkedList时出现编译错误

来自分类Dev

编译时初始化和运行时访问包含派生元素的initializer_list向量

来自分类Dev

使用包含闭包的类型初始化器初始化属性时出现编译错误

来自分类Dev

为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

来自分类Dev

类支撑初始化被误解为std :: initializer_list而不是副本构造

来自分类Dev

用initializer_list初始化数组?

来自分类Dev

从模板参数初始化 initializer_list

来自分类Dev

c ++ 11:使用显式的initializer_list对象初始化映射

来自分类Dev

在C ++ 11中使用initializer_list初始化unique_ptr

来自分类Dev

C ++类实例未初始化但没有编译错误,为什么

来自分类Dev

在初始化和声明指针变量时了解警告和编译错误

来自分类Dev

Inno Setup:初始化变量时,预期会出现编译错误分号(;)

来自分类Dev

Inno Setup:初始化变量时,预期会出现编译错误分号(;)

来自分类Dev

带有默认初始化的Clang编译错误

来自分类Dev

Swift中的UIViewController初始化引发编译错误

来自分类Dev

稍后添加initializer_list构造函数时,使用大括号初始化语法会改变构造行为吗?

来自分类Dev

cpp使用向量编译错误初始化二维数组

来自分类Dev

尝试使用operator(->)访问结构成员时出现编译错误

来自分类Dev

尝试使用operator(->)访问结构成员时出现编译错误

来自分类Dev

类内成员初始化是在编译时还是在运行时进行?

来自分类Dev

使用另一个类的类型定义的成员时发生C ++编译错误

来自分类Dev

使用另一个类的类型定义的成员时发生C ++编译错误

来自分类Dev

不能使用std :: initializer_list调用new运算符进行列表初始化吗?

来自分类Dev

我可以使用std :: initializer_list而不是括号括起来的初始化程序来初始化数组吗?

来自分类Dev

使用类的const成员的std :: deque :: erase编译错误

来自分类Dev

在类中将不完整类型的unique_ptr初始化为nullptr时,gcc会编译错误

来自分类Dev

使用lambda作为成员的成员初始化程序列表时出现VC ++ 2013错误

Related 相关文章

  1. 1

    尝试初始化结构向量时出现编译错误

  2. 2

    使用直接初始化与std :: initializer_list时的不同指令

  3. 3

    初始化LinkedList时出现编译错误

  4. 4

    编译时初始化和运行时访问包含派生元素的initializer_list向量

  5. 5

    使用包含闭包的类型初始化器初始化属性时出现编译错误

  6. 6

    为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

  7. 7

    类支撑初始化被误解为std :: initializer_list而不是副本构造

  8. 8

    用initializer_list初始化数组?

  9. 9

    从模板参数初始化 initializer_list

  10. 10

    c ++ 11:使用显式的initializer_list对象初始化映射

  11. 11

    在C ++ 11中使用initializer_list初始化unique_ptr

  12. 12

    C ++类实例未初始化但没有编译错误,为什么

  13. 13

    在初始化和声明指针变量时了解警告和编译错误

  14. 14

    Inno Setup:初始化变量时,预期会出现编译错误分号(;)

  15. 15

    Inno Setup:初始化变量时,预期会出现编译错误分号(;)

  16. 16

    带有默认初始化的Clang编译错误

  17. 17

    Swift中的UIViewController初始化引发编译错误

  18. 18

    稍后添加initializer_list构造函数时,使用大括号初始化语法会改变构造行为吗?

  19. 19

    cpp使用向量编译错误初始化二维数组

  20. 20

    尝试使用operator(->)访问结构成员时出现编译错误

  21. 21

    尝试使用operator(->)访问结构成员时出现编译错误

  22. 22

    类内成员初始化是在编译时还是在运行时进行?

  23. 23

    使用另一个类的类型定义的成员时发生C ++编译错误

  24. 24

    使用另一个类的类型定义的成员时发生C ++编译错误

  25. 25

    不能使用std :: initializer_list调用new运算符进行列表初始化吗?

  26. 26

    我可以使用std :: initializer_list而不是括号括起来的初始化程序来初始化数组吗?

  27. 27

    使用类的const成员的std :: deque :: erase编译错误

  28. 28

    在类中将不完整类型的unique_ptr初始化为nullptr时,gcc会编译错误

  29. 29

    使用lambda作为成员的成员初始化程序列表时出现VC ++ 2013错误

热门标签

归档