使用 friend 关键字查找模板函数
lookup template function with friend keyword
大家
我是c++的初学者。现在我尝试了解编译器如何使用 friend 关键字查找函数。
以下是带有警告和错误消息的代码。
我在代码中有两个问题。一个是警告,另一个是错误。
在问题(1) 中,编译器警告包含模板参数的函数是非模板函数。为什么是非模板函数?以及如何将包含模板参数的函数定义为非模板函数?
在问题 (2) 中,朋友模板函数 friendFunction(A const& val) 未被查找。按照我的理解,可以通过ADL的方式查到。
请告诉我如何理解上面的两个问题。
非常感谢你。
template<typename T>
class A {
/* ***** first declaration of functions without definition.
* ***** In this case, compiler assume the friend function will be defined
* ***** in one outer namespace, in this case ::. */
friend void friendFunction(A<T> const& val); // Problem(1) warning: please see below for message
// warning: friend declaration ‘void friendFunction(const A<T>&)’ declares a non-template function
};
// ??? How can I define friend void friendFunction(A<T> const& val) ???
template<typename T>
void friendFunction(A<T> const& val) {
std::cout << "::function(A<T>)" << std::endl;
}
void call_FriendFunction(A<int>* ptr);
void test_friend_keyword() {
A<int> a;
call_FriendFunction(&a);
}
void call_FriendFunction(A<int>* ptr) {
friendFunction(*ptr); // Problem(2) please see error message below
// undefined reference to `friendFunction(A<int> const&)'
/* In my understanding, the following friendFunction(*ptr); can be looked up
* by the following logic.
* (1) friendFunction(ptr) here is unqualified name.
* (2) Because friendFunction(*ptr) has an augment of A<int>* ptr,
* friendFunction(*ptr) have related class and related namespace of class A.
* (3) class A has declaration of
* friend void friendFunction(A<T> const& val);
* And it is allowed to see the friend template function.
* (4) As a result, friendFunction(*ptr) is looked up as
* friend void ::friendFunction(A<T> const& val); */
}
对于带有
的警告
friend void friendFunction(A<T> const& val);
假设 T
在 int
中声明
friend void friendFunction(A<int> const& val);
所以你必须定义
void friendFunction(A<int> const& val);
与
不同
template<typename T>
void friendFunction(A<int> const& val);
甚至
template<>
void friendFunction<int>(A<int> const& val);
可能的修复方法是在 friendFunction
之前声明一个模板函数:
template<typename T> class A;
template <typename T> void friendFunction(A<T> const& val);
template<typename T>
class A {
friend void friendFunction<>(A<T> const& val); // It is the template function
// Only the one with T is friend.
};
或者在class里面提供定义:
template<typename T>
class A {
friend void friendFunction(A<T> const& val) // It is not template
{
/*Definition*/
}
};
大家
我是c++的初学者。现在我尝试了解编译器如何使用 friend 关键字查找函数。 以下是带有警告和错误消息的代码。 我在代码中有两个问题。一个是警告,另一个是错误。
在问题(1) 中,编译器警告包含模板参数的函数是非模板函数。为什么是非模板函数?以及如何将包含模板参数的函数定义为非模板函数?
在问题 (2) 中,朋友模板函数 friendFunction(A const& val) 未被查找。按照我的理解,可以通过ADL的方式查到。
请告诉我如何理解上面的两个问题。 非常感谢你。
template<typename T>
class A {
/* ***** first declaration of functions without definition.
* ***** In this case, compiler assume the friend function will be defined
* ***** in one outer namespace, in this case ::. */
friend void friendFunction(A<T> const& val); // Problem(1) warning: please see below for message
// warning: friend declaration ‘void friendFunction(const A<T>&)’ declares a non-template function
};
// ??? How can I define friend void friendFunction(A<T> const& val) ???
template<typename T>
void friendFunction(A<T> const& val) {
std::cout << "::function(A<T>)" << std::endl;
}
void call_FriendFunction(A<int>* ptr);
void test_friend_keyword() {
A<int> a;
call_FriendFunction(&a);
}
void call_FriendFunction(A<int>* ptr) {
friendFunction(*ptr); // Problem(2) please see error message below
// undefined reference to `friendFunction(A<int> const&)'
/* In my understanding, the following friendFunction(*ptr); can be looked up
* by the following logic.
* (1) friendFunction(ptr) here is unqualified name.
* (2) Because friendFunction(*ptr) has an augment of A<int>* ptr,
* friendFunction(*ptr) have related class and related namespace of class A.
* (3) class A has declaration of
* friend void friendFunction(A<T> const& val);
* And it is allowed to see the friend template function.
* (4) As a result, friendFunction(*ptr) is looked up as
* friend void ::friendFunction(A<T> const& val); */
}
对于带有
的警告friend void friendFunction(A<T> const& val);
假设 T
在 int
中声明
friend void friendFunction(A<int> const& val);
所以你必须定义
void friendFunction(A<int> const& val);
与
不同template<typename T>
void friendFunction(A<int> const& val);
甚至
template<>
void friendFunction<int>(A<int> const& val);
可能的修复方法是在 friendFunction
之前声明一个模板函数:
template<typename T> class A;
template <typename T> void friendFunction(A<T> const& val);
template<typename T>
class A {
friend void friendFunction<>(A<T> const& val); // It is the template function
// Only the one with T is friend.
};
或者在class里面提供定义:
template<typename T>
class A {
friend void friendFunction(A<T> const& val) // It is not template
{
/*Definition*/
}
};