我有一个可以在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机器上进行编译,是否有任何建议。
答案 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<...> >
的更聪明的默认构造函数。