我正在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 ++数据类型(LONG
和BYTE
组成,并带有一个奇怪的TCHAR
数组) 。这怎么可能是模棱两可的重载?
答案 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?是一个非常详细的答案,为什么这个是这样的。