提问人:francesco 提问时间:7/12/2023 最后编辑:francesco 更新时间:7/12/2023 访问量:75
尽管使用指令,GCC 11.3.0 仍找不到运算符
gcc 11.3.0 does not find operator despite using directive
问:
以下代码(来自更复杂代码的简化示例)无法使用 gcc 11.3.0 进行编译
#include <array>
#include <memory>
#include <tuple>
namespace tools {
template <typename U, typename W, std::size_t N>
void operator*=(std::array<U, N>& a, const W& b) {
for (auto& x : a)
x *= b;
}
}
namespace nameA {
template <typename Jclass>
struct Abase {
template <typename... U>
void calc(const typename Jclass::Utype& v, typename Jclass::Wtype& out, std::tuple<U...> par) const;
};
template <typename Jclass>
template <typename... U>
void Abase<Jclass>::calc(const typename Jclass::Utype& v, typename Jclass::Wtype& out, std::tuple<U...> par) const
{
std::unique_ptr<Jclass> j{new Jclass};
std::apply([&](auto&&...x) { return j->calc(v, out, x...); }, par);
}
}
template <std::size_t N, std::size_t M>
struct outtype {
std::array<int, N> a;
std::array<int, M> b;
private:
template <class F, class... ArgsType>
void doall(F&& f, ArgsType... args) { f(a, std::forward<ArgsType>(args)...); f(b, std::forward<ArgsType>(args)...); }
public:
void operator*=(int rhs) { doall([&](auto& el) { using tools::operator*=; el *= rhs; }); }
};
namespace nameA {
template <typename U, typename W>
struct Jbase {
using Utype = U;
using Wtype = W;
template <typename D>
void calc(const U& in, W& out, const D& d) const
{
f(in, out);
out *= d;
}
virtual void f(const U& in, W& out) const = 0;
};
}
struct J : public nameA::Jbase<std::array<int, 3>, outtype<3, 3>> {
virtual void f(const std::array<int, 3>& in, outtype<3, 3>& out) const { out.a = in; out.b = in; }
};
int main()
{
nameA::Abase<J> a;
std::array<int, 3> in = { 1, 2, 3 };
outtype<3, 3> out;
a.calc(in, out, std::make_tuple(4));
}
我用
g++ -Wall -pedantic -std=c++17 -o test test.cpp
我得到的错误是
test.cpp:40:80: error: no match for ‘operator*=’ (operand types are ‘std::array<int, 3>’ and ‘int’)
40 | void operator*=(int rhs) { doall([&](auto& el) { using tools::operator*=; el *= rhs; }); }
g++ 的版本是 11.3.0。
这似乎很奇怪,因为我在 lambda 函数中明确传递了 .编译器没有给出任何一个候选列表。using tools::operator*=
doall
operator*=
链接到可以测试代码的 godbolt。
如果我替换
void operator*=(int rhs) { doall([&](auto& el) { using tools::operator*=; el *= rhs; }); }
跟
void operator*=(int rhs) { doall([&](auto& el) { tools::operator*=(el, rhs); }); }
然后代码编译,没有警告。 我看不出这两种选择之间的区别。
此外,使用较新的 gcc 13.1.1 时,代码会进行编译。
这是 gcc 11.3.0 的错误吗?
答:
2赞
Karen Baghdasaryan
7/12/2023
#1
您观察到的是一个错误,已在此处确认。gcc
评论