operator== 是友元时的链接器错误
Linker error when operator== is a friend
以下代码是重现我的问题的最少代码。当我尝试编译它时,链接器找不到 operator==
for Config
:
Undefined symbols for architecture x86_64:
"operator==(Config<2> const&, Config<2> const&)", referenced from:
_main in test2.o
operator==
是 Config
的朋友。但是当我不再将 operator==
声明为朋友时,代码编译器没有错误。
template <int DIM>
class Config{
// comment the following line out and it works
friend bool operator==(const Config<DIM>& a, const Config<DIM>& b);
public:
int val;
};
template <int DIM>
bool operator==(const Config<DIM>& a, const Config<DIM>& b){
return a.val == b.val;
}
int main() {
Config<2> a;
Config<2> b;
a == b;
return 0;
}
这里有什么问题?
您错过了在 friend
声明中声明模板:
template <int DIM>
class Config{
template <int DIM_> // <<<<
friend bool operator==(const Config<DIM_>& a, const Config<DIM_>& b);
public:
int val;
};
如果您想要 friend
函数声明,您 必须使用它的精确签名声明 。如果这涉及模板参数,则必须独立于封闭模板 class 或结构指定这些参数。
这里 brilliant answer 深入解释了 friend
声明的几个方面。
以下代码是重现我的问题的最少代码。当我尝试编译它时,链接器找不到 operator==
for Config
:
Undefined symbols for architecture x86_64:
"operator==(Config<2> const&, Config<2> const&)", referenced from:
_main in test2.o
operator==
是 Config
的朋友。但是当我不再将 operator==
声明为朋友时,代码编译器没有错误。
template <int DIM>
class Config{
// comment the following line out and it works
friend bool operator==(const Config<DIM>& a, const Config<DIM>& b);
public:
int val;
};
template <int DIM>
bool operator==(const Config<DIM>& a, const Config<DIM>& b){
return a.val == b.val;
}
int main() {
Config<2> a;
Config<2> b;
a == b;
return 0;
}
这里有什么问题?
您错过了在 friend
声明中声明模板:
template <int DIM>
class Config{
template <int DIM_> // <<<<
friend bool operator==(const Config<DIM_>& a, const Config<DIM_>& b);
public:
int val;
};
如果您想要 friend
函数声明,您 必须使用它的精确签名声明 。如果这涉及模板参数,则必须独立于封闭模板 class 或结构指定这些参数。
这里 brilliant answer 深入解释了 friend
声明的几个方面。