gpt4 book ai didi

c++ - 模板函数调用被函数混淆,在模板之前声明了错误的签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:10 24 4
gpt4 key购买 nike

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 的第一个声明与第二个声明完全无关。第一个声明在一个头文件中,第二个声明在另一个头文件中。我不想引入关于包含文件顺序的“奇怪”规则,尤其是当“读取”版本彼此无关时。

最佳答案

在实例化时,只完成参数依赖查找。您可以使用类型位于 F

的命名空间中的参数来解决您的问题
void F(int x,char y)
{
}
template<typename T>
void G(T t)
{
F(t);
}
void F(int x)
{
}

template<typename T>
struct wrapper {
operator T() const { return t; }
T t;
};

template<typename T> wrapper<T> make_wrapper(T t) {
wrapper<T> w = { t };
return w;
}

int main()
{
G(make_wrapper(5));
return 0;
}

关于c++ - 模板函数调用被函数混淆,在模板之前声明了错误的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13223278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com