Visual C ++ странные ошибки компилятора - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь сделать шифратор / расшифровщик, используя метод XOR. Я делал это раньше в консоли C ++, и я новичок в VC ++, поэтому я надеюсь, что вы мне поможете. Шифрование работает так:

key = 3
x = 5    // The item being encrypted

encryptedx = x ^ key // the "^" is XOR

Итак, теперь я хочу сделать это на VC ++, чтобы это выглядело лучше, чем окно консоли. В режиме конструктора в VC ++ у меня есть два полноформатных текстовых поля, поле редактирования ключа и несколько кнопок для запуска процесса. Звучит очень просто, но я получаю следующие ошибки:

------ Build started: Project: Encryptor, Configuration: Debug Win32 ------
1>  Encryptor.cpp
1>c:\users\**********c*********ncryptor\encryptor\Form1.h(264): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'System::String ^' (or there is no acceptable conversion)
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(707): could be 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(std::basic_string<_Elem,_Traits,_Ax> &&)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(762): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(767): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(772): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          while trying to match the argument list '(std::string, System::String ^)'
1>c:\*******gl\*****cryptor\encryptor\Form1.h(281): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'System::String ^' (or there is no acceptable conversion)
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(707): could be 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(std::basic_string<_Elem,_Traits,_Ax> &&)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(762): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(767): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(772): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          while trying to match the argument list '(std::string, System::String ^)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

А вот и код:

#include <string>
#include "crypFunc.cpp"

int key = 0;
char tempChar;
int stringLenght = 0;
string strBuffer = "";
using namespace std;

//
//
//
//
//



    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {
                 if(KeyBox->Text)
                 {
                 key =Convert::ToInt32(KeyBox->Text);
                 numericUpDown1->Value = key;
                 }


             }
//
//
//
//




private: System::Void EncryptButton_Click(System::Object^  sender, System::EventArgs^  e) 
         {

             EncryptedBox->Text = ""; 

            strBuffer = DecryptedBox->Text;
             stringLenght = strBuffer.size();
             if( strBuffer.size() && key)
             {
             for(int i = 0; i < stringLenght; i++)
             {
                tempChar = encrypt(strBuffer[i], key);
                EncryptedBox->Text = EncryptedBox->Text + tempChar; 
             }
             }

         }


private: System::Void DecryptButton_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             DecryptedBox->Text = "";
             strBuffer = Convert::ToString(EncryptedBox->Text); 
             stringLenght = strBuffer.size();
             if( strBuffer.size() && key)
             {
                 for(int i = 0; i < stringLenght; i++)
                 {
                     tempChar = decrypt(strBuffer[i], key);
                     DecryptedBox->Text = DecryptedBox->Text + tempChar;
                 }
             }
         }
};
}

Я очень надеюсь, что некоторые из вас смогут и захотят мне помочь.

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Для VS2008 и новее вы можете использовать marshal_as.В противном случае см. Ответ @ Скотта.

#include <msclr/marshal_cppstd.h>

String^ foo = "";
std::string bar = marshal_as<std::string>(foo);
1 голос
/ 08 февраля 2011

Похоже, вы пытаетесь назначить управляемый объект System :: String ^ на std :: string. Сначала вам нужно преобразовать System :: String:

http://msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx

Кроме того, просто чтобы заметить, это не просто стандартный "VC ++". Ваш код - C ++ / CLI (что может быть хорошо, если вы пытаетесь это сделать).

Надеюсь, это поможет.

0 голосов
/ 08 февраля 2011

Хорошо, я вернулся домой и попробовал кое-что для вас.

Этот код работает на моей машине без проблем. Соберите небольшую демонстрацию того, как преобразовать из std :: string в system :: String ^, а также из system :: string ^ в std :: string.

При чтении кажется, что это не лучшая идея перехода от std :: string к system :: string ^. Вы можете прочитать об этом, если хотите.

Вам также нужно будет установить поддержку Common Language Runtime для / clr. Удачи, и надеюсь, это поможет!

#include <string>
#include <iostream>
#include <msclr\marshal.h>
#include <msclr\marshal_cppstd.h> // you will only need one of these

using namespace std;
using namespace System;
using namespace msclr::interop;

int main() {
   //define our std::string
   string standardString = "Test String to Marshal";
   cout << "String before conversions: " << standardString<<endl;

   // convert std::string to system::string^ using marshalling
   String^ sysStringFromStandardString;
   sysStringFromStandardString = marshal_as<String^>( standardString );

   // convert system::string^ to std::string 
   string backToStdString;
   backToStdString = marshal_as<string>(sysStringFromStandardString);

   cout<< "String after converstion: "<<backToStdString<<endl;

   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...