2009-11-24 3 views
0

Хорошо, так что это раздражает меня, и я уверен, что это простая вещь. В основном, я работаю с клиентом C++ с открытым исходным кодом под названием POCO, чтобы сделать почтовый клиент для класса ...Видимо, базовый вопрос на C++

В принципе, у меня есть клиентский объект pop3, который извлекает электронные письма с моего почтового сервера, а затем помещает электронные письма в объекте MailMessage. Теперь я хочу, чтобы иметь возможность получить свои вложения, а только функциональность, кажется, что я должен сделать это следующая функция:

static const std::string & contentTransferEncodingToString(
    ContentTransferEncoding encoding 
); 

Проблема, я понятия не имел, что было следующее:

ContentTransferEncoding encoding

После копаться в исходном коде, я узнал, что у него есть что-то делать с «перечислений» (это является общественным, кстати):

enum ContentTransferEncoding 
    { 
     ENCODING_7BIT, 
     ENCODING_8BIT, 
     ENCODING_QUOTED_PRINTABLE, 
     ENCODING_BASE64 
    }; 

в основном, вложение Я пытаюсь открыть использует 7 бит enco динь. Кто-нибудь знает, как справиться с этими перечислениями, и как я могу передать их в функцию contentTransferEncodingToString?

Спасибо вам большое за ваши усилия :)

EDIT:

So, unreal, but I didn't realize that the function I was trying to access was protected, it wasn't the enums, so the way you all suggested to access the enums was correct! And I guess the way I was trying to access them was also correct =P. Just a big stupid mistake.

But thanks for all your efforts!!! Great community :)

+0

Объясните, пожалуйста, пожалуйста, пожалуйста, люди –

+0

Не могли бы вы вывести фактическое сообщение об ошибке, а также опубликовать фактический код, вызывающий метод contentTransferEncodingToString. –

+0

Возможно, вас заинтересует это предложение по обмену столами (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 «Обзор кода»). Он почти готов начать бета-тестирование, просто нужно еще несколько. – greatwolf

ответ

3

Вы можете сказать

const std::string& s = contentTransferEncodingToString(ENCODING_7BIT) 

или

const std::string& s = contentTransferEncodingToString(ContentTransferEncoding::ENCODING_7BIT) 
+0

I Ruben, похоже, что это не сработало ... Первая опция имела следующую ошибку: «ENCODING_8BIT»: необъявленный идентификатор и второй вариант говорит, что ContentTransferEncoding является защищенной переменной ... Интересно, поскольку ContentTransferEncoding является общедоступным в исходном коде ... – shawnjan

+0

Предполагая, что вы используете VS, вы можете нажать F12 (перейти к объявлению), чтобы узнать, к чему относится ContentTransferEncoding (это может например, защищенная переменная). Если есть 2, и вы ошибаетесь, вам нужно устранить ошибку, поставив перед ними префиксы пространства имен. –

+0

Другая вещь, которую вы могли бы сделать, - вывести класс из MailMessage и добавить метод, который использует ContentTransferEncoding там [как можно было бы получить защищенные значения enum в этом контексте] –

2

Очень просто, просто назвать свою функцию с элементом перечисления:

std::string str = contentTransferEncodingToString(ENCODING_8BIT); 

Перечни являются перечислением. Вы можете получить такой же результат, определив пучок

const int ENCODING_7BIT = 0; 
const int ENCODING_8BIT = 1; 

Однако, что произойдет, если вы передадите 8 в вашу функцию? Определение перечисления позволяет

  • Ограничить количество элементов, которые позволяют
  • Не нужно беспокоиться о том, как она представлена ​​(таким образом, имея некоторую абстракцию)
+0

копирование строки –

+0

У меня есть, но это определенно не работает. Я получаю следующее: «ENCODING_8BIT»: необъявленный идентификатор – shawnjan

+0

Я попытался измененную версию, но безрезультатно ... Я получил следующее: «Poco :: Net :: MailMessage :: contentTransferEncodingToString»: не может преобразовать параметр 1 от 'const int' до 'Poco :: Net :: MailMessage :: ContentTransferEncoding' – shawnjan

3

Я гугл о вашей проблеме, и я нашел это:

http://www.appinf.com/docs/poco/Poco.Net.MailMessage.html#16563

полного пространство имен Poco :: Net :: Message :: ContentTransferEncoding поэтому я предположил бы, что вы должны использовать:


using namespace Poco::Net::Message; 

или


string &s = contentTransferEncodingToString(Poco::Net::Message::ContentTransferEncoding::ENCODING_7BIT); 
+0

HI! Я на самом деле пробовал это (имя Poco: Net: MailMessage not Message), но оно не работает, проблема заключается в защите ContentTransferEncoding ... – shawnjan

+0

my bad, Poco: Net: MailMessage. можете ли вы вставить весь код и сообщение об ошибке? – chedi

2

ли класс, который пытается вызвать contentTransferEncodingToString унаследовав от Poco :: NET :: MailMessage?

Способ contentTransferEncodingToString защищен не публично и поэтому может быть вызван только из класса, который наследует MailMessage.

Если это не проблема, можете ли вы отправить сообщение об ошибке точно так, как это было напечатано компилятором.

3

Это правда, что функция, которую вы вызываете защищены и статичным, что означает, у вас есть должны иметь что-то вроде этого:


class test : public Poco::Net::MailMessage{ 
    pubic: 
    std::string myFunc(){ 
     // you can you the protected function here 
     return ContentTransferEncoding(ENCODING_7BIT); 
     // or 
     // because you have inherited all the class 
     // return CTE_7BIT; 

} 
+1

отсутствует l там: D –

2

Does ANYONE know how to deal with these enums, and how I can pass them into the contentTransferEncodingToString function?

Несколько ответов показали основной способ использования enum с. При их попытке вы получаете сообщения об ошибках, что синтаксис верен, но методы, которые используют эти enums, недоступны из области, в которой вы находитесь.

Таким образом, ответ на вопрос, вы можете получить доступ к тому, что хотите.

Методы, о которых идет речь, по-видимому, protected, что означает, что доступ к ним осуществляется через производный класс. Я не говорю, что это хороший дизайн, но очевидно, что дизайнеры POCO ожидают, что вы будете использовать.

+0

Согласно документам, перечисление ContentTransferEncoding не защищено. (Защищенные члены определяются синим значком с P внутри.) - http://www.appinf.com/docs/poco/Poco.Net.MailMessage.html#16477 –

+0

Отредактировано на основе окончательного ответа shawnjan –

0

Итак, нереально, но я не понимал, что функция, которую я пытаюсь получить, была защищена, это были не перечисления, поэтому способ, которым вы все предлагали доступ к перечислениям, был правильным! И я предполагаю, что способ, которым я пытался получить к ним доступ, также был правильным = P. Просто большая глупая ошибка.

Но спасибо за все ваши усилия !!! Отличное сообщество :)

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