2015-10-26 2 views
1

Я хочу массив двоичных сообщений в моем коде как литералы. Сообщения довольно смахивают, поэтому я подумал, что проще всего использовать «двоичные» литералы. Но как это сделать?Как создать массив бинарных литералов

Я попробовал этот код:

struct binary_message 
{ 
    binary_message(int size, unsigned char* bytes) : size_(size), bytes_(bytes) {} 
    int size_; 
    unsigned char* bytes_; 
}; 

binary_message messages[] = { 
    { 3, { 0x1, 0x2, 0x3 } }, 
    { 2, { 0x1, 0x2 } }, 
    { 1, { 0x1 } } 
}; 

с Visual Studio 2013 C++ компилятор, который я получаю ошибку:

error C2440: 'initializing' : cannot convert from 'initializer-list' to 'binary_message'. No constructor could take the source type, or constructor overload resolution was ambiguous 

С г ++ я получаю:

>g++ main.cpp 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive] 
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive] 

, если я использую г ++ -std = C++ 0x main.cpp Я все еще получаю:

main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message' 
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive] 
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive] 

Как исправить это?

UPDATE

Я думаю, вы имеете в виду что-то вроде этого?

#include <vector> 
#include <iostream> 

struct binary_message 
{ 
    binary_message(std::initializer_list<unsigned char> data) : bytes_(data) {} 
    std::vector<unsigned char> bytes_; 
}; 

int main() 
{ 
    binary_message messages[] = { 
      { 0x1, 0x2, 0x3 }, 
      { 0x1, 0x2 }, 
      { 0x1 } 
    }; 

    binary_message msg1 = messages[0]; 

    return 0; 
} 
+0

Бинарные литералы - это настоящая вещь с C++ 14 и выглядят как '0b100110' - если это не то, что вы имеете в виду, возможно, вам следует уточнить, что вы хотите сделать. – melak47

+0

Вы используете комбинацию десятичных литералов (например, «3») и шестнадцатеричных литералов (например, «0x3»). Но представляете ли вы эти целочисленные значения как десятичные, шестнадцатеричные, восьмеричные, двоичные и т. Д., Они все равно являются числами для компилятора. Во время выполнения нет оптимизации, которая соответствует этому представлению. –

+0

С 'const' вы можете сделать что-то вроде' '\ x01 \ x02 \ x03" ' – Jarod42

ответ

1

Вам нужен конструктор списка инициализаторов, если вы хотите использовать списки инициализаций для создания своего объекта. Ваш текущий конструктор принимает размер буфера и буфера, но { 3, { 0x1, 0x2, 0x3 } } ничего подобного - это список инициализаторов списка номеров и инициализаторов.

Чтобы правильно использовать списки инициализатора, ваш класс и конструктор должен искать примерно следующее:

binary_message(std::initializer_list<int> data) : data(data) {} 
... 
std::vector<int> data; 

И вы бы не использовать size вообще - размер вектора будет сказать вам.

Смежные вопросы