模板函数的顺序无缘无故调用编译错误



所以这很好用:

template<class V>
void bar(V v1, V v2) {
}
template <class T>
void foo(T t1, T t2) {
bar(t1, t2);
}
int main() {
foo(5, 6);
}

但是如果我这样改变foo和bar的顺序:

template <class T>
void foo(T t1, T t2) {
bar(t1, t2);
}
template<class V>
void bar(V v1, V v2) {
}
int main() {
foo(5, 6);
}

我得到一个编译错误:

请参阅正在编译的函数模板实例化"void foo(T,T("的引用

错误C3861"bar":找不到标识符"bar">

'bar'函数未在模板定义上下文中声明,并且可以只能通过实例化中与参数相关的查找找到上下文

是什么原因导致的?隐藏的问题是什么?这次我打破了cpp的什么规则
我将感谢对此事的深入了解

编辑:感谢您的评论,但由于某种原因,将条形图更改为交换导致错误:
此代码:

template<class V>
void swap(V v1, V v2) {
}
template <class T>
void foo(T t1, T t2) {
swap(t1, t2);
}
int main() {
foo(5, 6);
}

生成以下错误:

在尝试匹配参数列表"(T,T("时,请参阅对的引用正在编译的函数模板实例化"void foo(T,T(">
或"void std::swapstd::ios_base::iostate,0(_Ty&,_Ty&aamp;(noexcept"可能是"void swap(V,V("错误C2668"swap":对重载函数的模糊调用

我知道交换不是c++中的关键词
导致此错误的原因是什么?我已经在一个全新的项目中写了这个代码,但它仍然不起作用

由于相同的原因,您会从该代码中得到编译器错误:

void foo(T t1, T t2) {
bar(t1, t2);
}
void bar(V v1, V v2) {
}
int main() {
foo(5, 6);
}

在声明bar之前,不能调用它。解决方案:在调用bar之前声明它,或者将bar的整个定义移动到foo之前。

最新更新