Ошибки компиляции при определении вектора кортежа в C ++ 11 с использованием GCC v4.8 в Ubuntu 14.04 - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь определить вектор кортежей в C ++ 11, как показано ниже:

#include <iostream>
#include <string>
#include <vector>
#include <tuple>

typedef unsigned char uchar;
typedef std::tuple<uchar, std::string, uchar, float> fruitInfoTuple;
const std::vector<fruitInfoTuple> jointsInfo{
  { 0,  "mango",   100,   -6.01},
  {10,  "apple",   144,    6.25},
  {12,  "orange",  159,    2.59},
  {33,  "banana",  144,  -28.96},
  { 4,  "grapes",  128,    3.79},
};

Я компилирую программу с включенным флагом C ++ 11.Тем не менее, он показывает ошибки усложнения, как показано ниже:

ravi@lab:~/Desktop/a$ g++  -std=c++11 learn.cpp 
learn.cpp:14:1: error: converting to ‘std::tuple<unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float>’ from initializer list would use explicit constructor ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements = {int, const char (&)[6], int, double}; <template-parameter-2-2> = void; _Elements = {unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float}]’
 };
 ^
learn.cpp:14:1: error: converting to ‘std::tuple<unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float>’ from initializer list would use explicit constructor ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements = {int, const char (&)[6], int, double}; <template-parameter-2-2> = void; _Elements = {unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float}]’
learn.cpp:14:1: error: converting to ‘std::tuple<unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float>’ from initializer list would use explicit constructor ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements = {int, const char (&)[7], int, double}; <template-parameter-2-2> = void; _Elements = {unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float}]’
learn.cpp:14:1: error: converting to ‘std::tuple<unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float>’ from initializer list would use explicit constructor ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements = {int, const char (&)[7], int, double}; <template-parameter-2-2> = void; _Elements = {unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float}]’
learn.cpp:14:1: error: converting to ‘std::tuple<unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float>’ from initializer list would use explicit constructor ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements = {int, const char (&)[7], int, double}; <template-parameter-2-2> = void; _Elements = {unsigned char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char, float}]’

Я думаю, что GCC 4.8 не поддерживает функцию кортежа.Есть ли обходной путь, пожалуйста?Обратите внимание, что я могу использовать boost при необходимости.Я просто хочу чистый способ определения кортежа, как сделано выше.

Ответы [ 2 ]

4 голосов
/ 08 марта 2019

Вы можете попробовать:

const std::vector<fruitInfoTuple> jointsInfo{
    fruitInfoTuple{ 0,  "mango",   100,   -6.01},
    fruitInfoTuple{10,  "apple",   144,    6.25},
    fruitInfoTuple{12,  "orange",  159,    2.59},
    fruitInfoTuple{33,  "banana",  144,  -28.96},
    fruitInfoTuple{ 4,  "grapes",  128,    3.79},
};
3 голосов
/ 08 марта 2019

В C ++ 11 вы должны использовать std::make_tuple для создания кортежа:

#include <iostream>
#include <string>
#include <vector>
#include <tuple>

typedef unsigned char uchar;
typedef std::tuple<uchar, std::string, uchar, float> fruitInfoTuple;
const std::vector<fruitInfoTuple> jointsInfo{
  std::make_tuple( 0,  "mango",   100,   -6.01),
  std::make_tuple(10,  "apple",   144,    6.25),
  std::make_tuple(12,  "orange",  159,    2.59),
  std::make_tuple(33,  "banana",  144,  -28.96),
  std::make_tuple( 4,  "grapes",  128,    3.79),
};
int main()
{
    for(int i = 0 ; i < jointsInfo.size(); ++i)
    {
        std::cout << std::get<1>(jointsInfo[i]) << std::endl;

    }
}

Результат:

mango
apple
orange
banana
grapes
...