程序可以在Mac上编译,但不能在Linux上编译。获取错误:从初始化列表转换为

时间:2018-11-20 14:41:37

标签: c++ linux macos tuples

我有一个可以在Mac上成功编译的程序,但是当我在Linux桌面上尝试时却无法。相反,我收到以下错误:

plot.cpp:12:63: error: converting to ‘std::tuple<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char,
std::char_traits<char>, std::allocator<char> > >’ 
from initializer list would use explicit constructor 
‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) 
[with _UElements = {const char (&)[4], const char (&)[6], const char (&)[6]}; 
<template-parameter-2-2> = void; _Elements = {std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, std::basic_string<char,
 std::char_traits<char>, std::allocator<char> >}]’

plot.cpp中的12个这样:

vector<tuple <string, string, string> >{
    {"yes", "Agree", "Empty"}, {"no", "Disagree", "Empty"}},

此向量在header.h中初始化,位于此处:

class Menu
{
    std::string _name, _situation, _excuse;
    std::vector<std::tuple <std::string, std::string, std::string>> _choices;
    std::vector<std::string> _items;

    public:
        Menu(const std::string &name,
             const std::string &situation,
             const std::string &excuse,
             const std::vector<std::tuple <std::string, std::string, std::string>> &choices = std::vector<std::tuple <std::string,std::string, std::string> >{},
             const std::vector<std::string> &items = std::vector<std::string>{});
        virtual ~Menu ();
        const bool operator==(const std::string &name);
        const std::string& Explain_Choice();
        const void Enter_String();
        std::string choice;
        std::string ItemChoice;
        const void Present_Choice() ;
        const void No_Choice();
};

我四处张望,我怀疑错误是来自header.h中我说&choices =的那一行。但是,我尝试以不同的方式初始化它的尝试没有成功。

我有2个问题。首先,为什么此代码可以在我的mac机上而不在linux上编译,其中一个编译器是否“错误”?其次,关于如何更改代码以使其可以在Linux机器上进行编译,是否有任何建议。

1 个答案:

答案 0 :(得分:1)

这里有些可疑:

         ...
         const std::string &excuse,
         const std::vector<std::tuple <std::string, std::string, std::string>> &choices = std::vector<std::tuple <std::string,std::string, std::string> >{},
         const std::vector<std::string> &items = std::vector<std::string>{});
         ...

我知道您可以使用默认的const参数通过引用进行传递,但这绝对看起来像代码气味。

根据错误消息,看起来第二行是您的错误来源。在这种情况下,最好重载构造函数,而不要使用这些特定的默认参数。

This answer提供了有关此特定错误的更多信息(unordered_map,但原理和解释是相同的。)

总而言之,这可能是编译器正在使用的默认C ++标准之间的差异。 g++默认使用std=c++11,不确定OSX编译器使用什么。您可能需要将std=c++14传递给g++,以获得std::vector<std::tuple<...> >的更聪明的默认构造函数。