【发布时间】:2013-09-03 18:12:14
【问题描述】:
我正在尝试在命名空间内调用重载函数,但有点挣扎。
工作示例 1:无命名空间
class C {};
inline void overloaded(int) {}
template<typename T> void try_it(T value) {
overloaded(value);
}
inline void overloaded(C) {}
int main()
{
try_it(1);
C c;
try_it(c);
return 0;
}
工作示例 2:在模板之前定义的所有重载
class C {};
namespace n {
inline void overloaded(int) {}
inline void overloaded(C) {}
}
template<typename T> void try_it(T value) {
n::overloaded(value);
}
int main()
{
try_it(1);
C c;
try_it(c);
return 0;
}
破例 3:模板后的一些重载
class C {};
namespace n {
inline void overloaded(int) {}
}
template<typename T> void try_it(T value) {
n::overloaded(value);
}
namespace n {
inline void overloaded(C) {}
}
int main()
{
try_it(1);
C c;
try_it(c); // /tmp/test.cpp: In function ‘void try_it(T) [with T = C]’:
// /tmp/test.cpp:19:15: instantiated from here
// /tmp/test.cpp:8:7: error: cannot convert ‘C’ to ‘int’ for argument ‘1’ to ‘void n::overloaded(int)’
return 0;
}
为什么会这样?我需要做什么才能在模板函数之后声明或定义重载?
【问题讨论】:
-
如果您在模板之前声明它们并在之后实现它们会怎样?
-
与案例 #3 相同的错误 - 请注意,第二个的声明仍在模板之后。由于代码组织问题,我不想在模板之前使用它。
-
你删除了
inline吗? -
是的,我删除了
inline。 -
你的问题不是重载解析,而是名称查找(没有找到第二个重载)。考虑将其更改/添加到问题标题和标签中。