我正在做一个Taglib C++库的实现。这个库有一个叫做"Filename"的类,当从用户文件系统打开文件时使用。在源文件头文件中它说它支持
- 常量wchar_t *
- 常量字符 *
- 常量文件名&
当我使用w_char_t文件编码字符串构建. dll时,这个方法非常好用,确切地说是使用. unicode_str()或Taglib::String::toCWString()函数从Godot::String转换而来的。当我想使用Github操作构建lib文件时,问题出现了,它失败了,说:
error: no matching function for call to ‘TagLib::Vorbis::File::File(const wchar_t*)’
772 | TagLib::Ogg::Vorbis::File OggFile(path.toCWString());
但是当我查看源文件时,它清楚地表明它支持这种编码:
class TAGLIB_EXPORT FileName
{
public:
FileName(const wchar_t *name);
FileName(const char *name);
FileName(const FileName &name);
operator const wchar_t *() const;
operator const char *() const;
const std::wstring &wstr() const;
const std::string &str() const;
String toString() const;
private:
const std::string m_name;
const std::wstring m_wname;
};
#else
typedef const char *FileName;
#endif
为什么这个构造函数在这里不受支持,而在我的机器上却不受支持?这和编译器有关系吗?库的版本在我的机器上和Github Action中是完全相同的,所以构造函数也应该存在于那里。
编辑:Taglib::Vorbis::File
的构造函数,以及Taglib中的任何其他文件,在其构造函数中接受Filename
作为文件路径。
以下是Taglib::Vorbis::File
的定义示例:
class TAGLIB_EXPORT File : public Ogg::File
{
public:
/*!
* Constructs a Vorbis file from \a file. If \a readProperties is true the
* file's audio properties will also be read.
*
* \note In the current implementation, \a propertiesStyle is ignored.
*/
File(FileName file, bool readProperties = true,
Properties::ReadStyle propertiesStyle = Properties::Average);
我希望我的Taglib集成支持文件名中的所有Unicode字符,但由于这个错误,我只能构建一个发布版本,其中文件名被限制为ASCII字符。
1条答案
按热度按时间vom3gejh1#
您发布的
FileName
定义的代码片段遗漏了它上面的行:#ifdef _WIN32
(tiostream.h)。但是您包含了#else
,它使FileName
成为const char*
的类型定义。如果你在Windows上编译你的代码,
FileName
将是一个可以从const wchar_t*
或const char*
构造的类。如果你不这样做,FileName
只是一个const char*
。后者必须是运行的Github操作的情况,这就是为什么你会得到错误。为了同时支持这两个平台,这里只能使用
const char*
。