我遇到模板问题,我想获取文件的内容并将其存储在String中。我正在使用Qt处理一个泛型函数,该函数将处理char *,QString和string。
我有一个模板,我打电话给:
std::string test = openStyle("style.css");
我想进入 test 值 styleToAdd ,这是我的文件 style.css 的内容:
编辑:将const T& openstyle更改为const T,感谢Stadium。
template<typename T>
const T openStyle(const T &type)
{
QFile File(QCoreApplication::applicationDirPath() + "/" + type);
File.open(QFile::ReadOnly);
QString styleToAdd = QLatin1String(File.readAll());
return (styleToAdd);
}
但汇编说:
invalid initialisation of reference type "const char (&)[14]" from expression "QString"
我认为这是因为在模板中,返回值与参数相同而不是我的 test 变量,但是有没有办法能够返回另一种类型(通用方式) )
所以我们可以用模板做这样的事情:
std::string test = openStyle("style.css");
char * test = openStyle("style.css");
QString test = openStyle("style.css");
const char * test = openStyle("style.css");
答案 0 :(得分:2)
您可以使用C ++ 14进行编译,并使用-std=c++1y
进行自动返回类型演绎:
template<typename T>
auto T openStyle(const T &type)
{
QFile File(QCoreApplication::applicationDirPath() + "/" + type);
File.open(QFile::ReadOnly);
QString styleToAdd = QLatin1String(File.readAll());
return (styleToAdd);
}
答案 1 :(得分:1)
您不需要模板。如果type
是不是字符串的任何内容或者无法隐式转换为字符串,则代码将失败。
我看到你想从中得到的例子,我可以告诉你的是
QString
包含toStdString()
,toUtf8()
等函数,这些函数返回std::string
对象的QString
等效项std::string
可以使用c_str()
函数转换为C字符串。此外,您还可以使用QString
将QByteArray
转换为C字符串,以存储QString::toLatin1()
的结果,然后调用QByteArray::data()
并将其分配给const char *
。这有点超过顶级omho,但它是另一种做事方式。
如果您不希望在每次要将QString
转换为两个标准C / C ++字符串之一时执行所有步骤和调用,则可以创建为您执行此操作的小函数表示。
答案 2 :(得分:1)
无法以您尝试的方式自动确定函数的返回类型。
如果你想要一个你所描述的模板函数,语法将是这样的:
template<typename T, typename U>
const T &openStyle(const U &type)
但你需要这样称呼它:
std::string test = openStyle<std::string,const char[]>("style.css");
这可能不是你想要的。除此之外,你必须找到一种方法将QString styleToAdd
转换为任何类型T
- 所以问题没有解决,只是转移到了返回类型。
由于文件名始终是一个字符串,您只需在此处选择一个,并始终返回QString
并定义您的函数:
const QString &openStyle(const std::string &type)
//choose if you like std::string, QString or char[] here.
虽然您不能在QString之外重载强制转换运算符,但您可以为所需类型全局重载流运算符:
operator<< (std::string& left,const QString& right){left = right.toStdString();}
operator<< (char*, const QString&); //similar conversions here
operator<< (QString&, const std::string&); //and here
使用提供的函数QString::toStdString()
和std::string::c_str()
,然后写:
std::string test << openStyle("style.css");
char * test << openStyle("style.css");
QString test << openStyle("style.css");
const char * test << openStyle("style.css");
答案 3 :(得分:1)
考虑到你正在使用QT,你可能会考虑只使用QString类,并在你想将它转换为const char *或std :: string对象时最终调用QString的方法。你真的不需要模板。你可以使用类似的东西:
QString openStyle(const QString &type) { ... }
你的代码中还有一个非常讨厌的错误:你试图将一个const引用返回给一个局部变量,这是错误的并且会导致一个未定义的行为(很可能你会得到一个核心转储)。 正如您所看到的,我已经从const T&amp;更改了您的返回类型。到T。