std :: wstring和LOGFONT重载冲突 - 为什么?

时间:2014-02-07 01:15:42

标签: c++ gcc overloading

我正在GCC 4.8.1下开展一个C ++项目。我有两个getter / setter对:

LOGFONT GetTitleBarFont();
void SetTitleBarFont(LOGFONT titleBarFont);

std::wstring GetTitleBarFont();
void SetTitleBarFont(std::wstring titleBarFont);

但由于某种原因,GCC告诉我这些都不是有效的重载。

error: 'std::wstring GetTitleBarFont()' cannot be overloaded
error: with 'LOGFONT GetTitleBarFont()'

我不明白这里的问题是什么。 std::wstring是STL类型(确切地说std::basic_string<wchar_t>),在幕后有大量模板工作。 LOGFONT是一种Windows数据类型(http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx),几乎完全由本机C ++数据类型(LONGBYTE组成,并带有一个奇怪的TCHAR数组) 。这怎么可能是模棱两可的重载?

3 个答案:

答案 0 :(得分:2)

您不能基于返回类型重载方法,因为重载解析会考虑函数签名

1.3.11签名

  

有关参与重载的函数的信息   resolution(13.3):它的参数类型列表(8.3.5),如果是   function是一个类成员,函数上的cv-qualifiers(如果有的话)   本身和声明成员函数的类。 [...]

--- ---编辑
要详细说明可能的解决方案,您可以

1)更改getter的名称:

std::wstring GetTitleBarFontWString();
LOGFONT GetTitleBarFontLogFont();

2)有参数(这不是很好,但有时你必须)

void GetTitleBarFont(std::wstring& out);
void GetTitleBarFont(LOGFONT& out);

3)滥用模板专业化,以便调用者可以指定他想要的内容。 (GetTitleBarFont<std::wstring>GetTitleBarFont<LOGFONT>

基本上没有很好的解决方案。

克里斯为3)的完全学分,部分为2)

答案 1 :(得分:1)

假设字符串返回函数不提供字体,而是字体 name ,显而易见的解决方案是

std::wstring GetTitleBarFontName();
void SetTitleBarFontName(std::wstring titleBarFont);

因为你不能仅使用返回类型作为鉴别器重载。

答案 2 :(得分:0)

对于任何遇到这个问题的人而言,正如我刚才所做的那样,为什么C ++在确定使用哪个重载时不考虑返回值:Function overloading by return type?是一个非常详细的答案,为什么这个是这样的。

相关问题