我是编程新手,所以需要你的帮助,只需尝试使用CLR控制台应用程序中的Speech Synthesizer对象在Windows 10上的Visual Studio 2015中使用Text to Speech C ++编写程序。但是我无法弄明白,如何通过变量“t”来说不仅仅是合成 - >说话(“保存线”);和synth->说话(“线存在”); ,但是像这样的“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;
}
和marshal的这种方式:
#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 ::互操作:: error_reporting_helper&LT; _To_Type,_From_Type,假&gt;::marshal_as': 库或头文件不支持此转换 不包括此转换所需的内容。
错误C2065'_This_conversion_is_not_supported':未声明的标识符 X_TTS2 c:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ msclr \ marshal.h 219
答案 0 :(得分:1)
根据文件:
如果您尝试编组一对不受支持的数据类型,
marshal_as
将在编译时生成错误C4996。有关详细信息,请阅读此错误提供的消息。可以生成C4996错误,而不仅仅是已弃用的函数。其中一个例子是尝试编组一组不受支持的数据类型
记录支持的转化:
如果您使用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()));