过去 9 个小时我一直在敲头。
我刚刚买了一台配备 M3 处理器 (ARM) 的新 MacBookPro,并安装了所有命令行工具,包括
clang
,以及 xcode-select install
。
clang++
将类内的 friend
声明及其在类外的定义误认为是两个不同的函数,尽管它们具有相同的签名。
我尽可能地减少了有问题的代码,以暴露编译错误的原因。我确信这意味着
clang
有问题,因为我已经编写 C++ 一段时间了,但从未遇到过这种情况 - 该代码在我的其他 Mac 和 Linux 实例上也可以正常编译。
我删除并重新安装了所有命令行工具。同样的东西。
这是基本代码:
#include <iostream>
namespace gml {
template <typename T>
concept Numeric = requires (T value) {
T{};
// lots of stuff...
};
template <Numeric T>
class tensor {
// lots more stuff...
public:
tensor() = default; // constructs an empty tensor
template <Numeric U, Numeric V>
friend bool operator==(const tensor<U>&, const tensor<V>&);
};
template <Numeric U, Numeric V>
bool operator==(const tensor<U>& t1, const tensor<V>& t2) {
return true;
}
}
int main() {
gml::tensor<long double> t;
gml::tensor<long double> t3;
std::cout << std::boolalpha << "t == t3: " << (t == t3) << std::endl;
return 0;
}
...这是我从上面得到的确切编译错误:
test.cpp:26:54: error: use of overloaded operator '==' is ambiguous (with operand types 'gml::tensor<long double>' and 'gml::tensor<long double>')
std::cout << std::boolalpha << "t == t3: " << (t == t3) << std::endl;
~ ^ ~~
test.cpp:15:21: note: candidate function [with U = long double, V = long double]
friend bool operator==(const tensor<U>&, const tensor<V>&);
^
test.cpp:18:10: note: candidate function [with U = long double, V = long double]
bool operator==(const tensor<U> &t1, const tensor<V> &t2) {
^
1 error generated.
如果有人能给我一些对此的见解,我将不胜感激。
P.S.,我使用
clang++ -std=c++20 test.cpp -o test
进行编译,并运行 clang++ --version
打印:
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: arm64-apple-darwin23.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
我想我可能需要使用不同的编译器!
不,你不必得到它。只需更改一下好友操作员模板即可。
#include <iostream>
namespace gml {
template <typename T>
concept Numeric = requires(T value) {
T{};
// lots of stuff...
};
template <Numeric T>
class tensor {
// lots more stuff...
public:
tensor() = default; // constructs an empty tensor
template <Numeric U>
friend bool operator==(const tensor<T>& t1, const tensor<U>& t2);
};
template <Numeric U, Numeric V>
bool operator==(const tensor<U>& t1, const tensor<V>& t2) {
return true;
}
} // namespace gml
int main() {
gml::tensor<long double> t;
gml::tensor<long double> t3;
std::cout << std::boolalpha << "t == t3: " << (t == t3) << std::endl;
return 0;
}