1

Я новичок в программировании, поэтому вам нужна ваша помощь, просто попробуйте сделать программу с текстом на речь C++ в Visual Studio 2015 в Windows 10 с использованием объекта Speech Synthesizer в приложении консоли CLR , Но я не могу понять, как получить строку через переменную «t», чтобы говорить не только synth-> Speak («Линия сохранена»); и synth-> Speak («Линия существует»); , но с «t» следующим образом: «Линия (текстовая строка) существует». Итак, как я могу передать строку функции Speak? Можете ли вы помочь мне понять:Строка ввода текста в речь

#include "stdafx.h" 
#include <conio.h> 
#include <Windows.h> 
#include <fstream> 
#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 
using namespace System; 
using namespace System::Speech::Synthesis; 
using namespace System::IO; 

const string FILE_NAME = "lines.txt"; 

vector<string> getFileLines(string file) { 
    ifstream in(FILE_NAME); 
    vector<string> lines; 
    for (string line; getline(in, line);) { 
     lines.push_back(line); 
    } 
    return lines; 
} 

string getUserInput() { 
    string str; 
    getline(cin, str); 
    return str; 
} 

int main() 

{ 

    vector<string> lines = getFileLines(FILE_NAME); 

    ofstream fileOut(FILE_NAME, ios::app); 

    for (int n = 0; n < 10; n++) 

    { 

    cout << "Write: > "; 
    std::string t = getUserInput(); 

    auto it = std::find(lines.begin(), lines.end(), t); 

    if (it == lines.end()) { 

     fileOut << t << endl; 
     lines.push_back(t); 

     cout << "Line \"" << t << "\" saved.\n"; 

     SpeechSynthesizer^ synth = gcnew SpeechSynthesizer(); 
     synth->Speak("Text saved"); 

    } 

    else 

    { 

     cout << "LIne \"" << t << "\" exist.\n"; 

     SpeechSynthesizer^ synth = gcnew SpeechSynthesizer(); 
     synth->Speak("Line exist"); 


    } 
} 

    cout << endl; 
    getUserInput(); 
    return 0; 
} 

и таким образом с маршалом:

#include "stdafx.h" 
#include <conio.h> 
#include <Windows.h> 
#include <fstream> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <msclr\marshal_cppstd.h> 

using namespace msclr::interop; 
using namespace std; 
using namespace System; 
using namespace System::Speech::Synthesis; 
using namespace System::IO; 

const string FILE_NAME = "lines.txt"; 

vector<string> getFileLines(string file) { 
    ifstream in(FILE_NAME); 
    vector<string> lines; 
    for (string line; getline(in, line);) { 
     lines.push_back(line); 
    } 
    return lines; 
} 

string getUserInput() { 
    string str; 
    getline(cin, str); 
    return str; 
} 

int main() 

{ 

    vector<string> lines = getFileLines(FILE_NAME); 

    ofstream fileOut(FILE_NAME, ios::app); 

    for (int n = 0; n < 10; n++) 

    { 

    cout << "Write: > "; 
    std::string t = getUserInput(); 

    auto it = std::find(lines.begin(), lines.end(), t); 

    if (it == lines.end()) { 

     fileOut << t << endl; 
     lines.push_back(t); 

     cout << "Line \"" << t << "\" saved.\n"; 

     String^ str = marshal_as<String^>(str); 
     std::string line = "Line " + t + " exists!"; 
     synth->Speak(marshal_as<String^>(line)); 

    } 

    else 

    { 

     cout << "LIne \"" << t << "\" exist.\n"; 

     String^ str = marshal_as<String^>(str); 
     std::string line = "Line " + t + " exists!"; 
     synth->Speak(marshal_as<String^>(line)); 

    } 
} 

    cout << endl; 
    getUserInput(); 
    return 0; 
} 

Я получил эту ошибку:

Ошибка C4996 «msclr :: Interop :: error_reporting_helper < _To_Type, _From_Type, false>:: marshal_as ': Это преобразование не поддерживается библиотекой или файлом заголовка , необходимых для этого преобразования, не включается.

Ошибка C2065 '_This_conversion_is_not_supported': необъявленный идентификатор X_TTS2 C: \ Program Files (x86) \ Microsoft Visual Studio 14,0 \ \ VC включить \ msclr \ marshal.h 219

ответ

1

За документации:

marshal_as

Если вы пытаетесь выстроить пару типов данных, которые не поддерживаются, marshal_as ш ill генерирует ошибку C4996 во время компиляции. Прочтите сообщение с этой ошибкой для получения дополнительной информации. Ошибка C4996 может генерироваться не только для устаревших функций. Одним из примеров этого пытается выстроить пару типов данных, которые не поддерживаются

Поддерживаемые преобразования задокументированы:

Overview of Marshaling in C++

marshal_as() функция поддерживает сортировочной std::string к System::String^ если вы используйте marshal_cppstd.h, что ваш пример:

#include <msclr\marshal_cppstd.h> 

std::string line = "Line " + t + " exists!"; 
synth->Speak(marshal_as<String^>(line)); 

Таким образом, ошибка шоу не имеет смысла, если он не имеет в виду это заявление:

String^ str = marshal_as<String^>(str); 

Вы пытаетесь выстроить в String^ к String^, который не поддерживается преобразование маршалом. Кроме того, использование переменной в том же самом заявлении, объявляющем, что это неопределенное поведение, так что вам нужно полностью удалить заявление, поскольку оно бесполезно.

В качестве альтернативы, marshal_as() поддерживает маршалинге в const char*, если вы используете marshal.h:

#include <msclr\marshal.h> 

std::string line = "Line " + t + " exists!"; 
synth->Speak(marshal_as<String^>(line.c_str())); 
+0

_hello, спасибо за отзыв, очень полезно, так что, кажется, я могу использовать его таким образом, работает '#include std :: string line = "Линия" + t + "существует!"; synth-> Speak (marshal_as (line.c_str())); ' –

+0

@ztores вы можете, да. 'marshal_as (строка)' также должен работать, поскольку 'std :: string'->' String^'поддерживается и документируется. –