gpt4 book ai didi

c++ - 指定应调用非成员函数而不是成员函数

转载 作者:行者123 更新时间:2023-11-28 01:39:30 25 4
gpt4 key购买 nike

我有一个类(class),成员叫 f同时还有一个名为 f 的通用自由函数.免费功能f旨在从另一个成员(下面称为 g)调用。

class A{};
int f(A const& a){return 5;} // generic free f

template<class T>
struct B{
void f() const{} // member f
int g(){
T a;
auto i = f(a) + 1; // here (cannot resolve f)
return i;
}
};

int main(){
B<A> b;
int j = b.g();
assert(j == 6);
}

事实证明,我的编译器(GCC 和 clang)无法解析对 f 的调用.

error: no matching function for call to ‘B::f(A&)’
auto i = f(a) + 1; ^
note: candidate: void B::f() const
void f() const{} ^
note: candidate expects 0 arguments, 1 provided

这当然是因为它与成员 f 混淆了.然而,只有 ::f有道理。

如果我强制使用成员函数,我可以说 this->fB::f .但是我不知道可以做相反的语法,即强制使用自由函数 ::f或者实际上是一些外部解决方案 f由 ADL 给出并禁用成员函数(类似 notthis->f )。

我可以使用 using ::f :

... int g(){
T a;
using ::f;
auto i = f(a) + 1;
return i;
} ...

但是,这不是通用的,因为我不知道哪个命名空间 T属于,我想要通用代码。 (这里是 :: 但对于 T = A ,但对于我不知道的其他 namespace 中的其他类)。

例如类B<ns::C>应该编译:

namespace ns{
class C{};
int f(C const& a){return 5;} // genetic free f
}

当然,我可以重命名所有内容以避免冲突,但这不是一个可接受的解决方案,假设将自由函数和成员函数都称为 f 是有意义的.

这是 GCC 和 clang 的错误、语言的缺陷还是我缺少一些明显的方法来指定不使用成员函数?

(该示例使用 C++11,但该问题适用于任何版本的 C++)。


感谢@JohnZwinck,这是当前的解决方法

class A{};
int f(A const& a){return 5;} // genetic free f

class nonmember{
protected:
template<class TT> static decltype(auto) _f(TT&& t){return f(std::forward<TT>(t));}
};

template<class T>
struct B : private nonmember{
void f() const{} // member f
int g(){
T a;
auto i = _f(a) + 1;
return i;
}
};

最佳答案

Is this a bug on GCC and clang, a defect on the language?

以上都不是。名称与调用匹配的成员函数是最匹配的,这是语言中的设计决策。如果你想避免它们,你可以通过一个中间自由函数调用:

template<class T>
int call_f(const T& arg){
return f(arg);
}

template<class T>
struct B{
void f() const{}
int g(){
T a;
auto i = call_f(a) + 1;
return i;
}
};

关于c++ - 指定应调用非成员函数而不是成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841741/

25 4 0
文章推荐: c++ - Boost multi_array BOOST_ASSERT 已抛出断点
文章推荐: c++ - 尝试进行多态性时出现 c2011 错误 c++
文章推荐: c++ - 从函数返回一个 std::Vector 需要一个默认值