GCC 4.6 不接受以下代码:
void F(int x,char y)
{
}
template<typename T>
void G(T t)
{
F(t);
}
void F(int x)
{
}
int main()
{
G(5);
return 0;
}
应该是吗?
如果没有,是否有人有解决方法的好主意?发生这种情况的真实世界场景是 G 是用于解决特定类型问题的库的一部分,需要一个名为 F 的用户提供的辅助函数。但是,对于不同类型的问题,F 采用不同数量的参数。库附带了一些 F 的示例实现。
发生的情况是,根据客户端使用的#include-order,只有 F 的“错误类型”可能在模板声明时可见,然后 GCC 放弃,而不等到用户提供正确的 F被定义为。即使模板实例化发生在定义正确的 F 之后也是如此。
更新:是的,我知道如果 F 的所有声明都发生在 G 之前,或者如果 F 的所有声明都发生在 G 之后,它会起作用。但是,这对我并没有太大帮助。
更新:在这个最小示例改编的代码中,F 真的被称为“读取”。并且第一个 read 声明与第二个完全没有关系。第一个声明在一个头文件中,第二个在另一个头文件中。我不想介绍有关包含文件顺序的“奇怪”规则,尤其是当“读取”的版本彼此无关时。