clang bug?不明确的函数调用编译错误,但不存在歧义

问题描述 投票:0回答:1

过去 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
c++ templates clang friend
1个回答
0
投票

我想我可能需要使用不同的编译器!

不,你不必得到它。只需更改一下好友操作员模板即可。

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.