gpt4 book ai didi

c++ - CRTP 的模糊过载

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:09 24 4
gpt4 key购买 nike

我在使用 CRTP ( Curiously recurring template pattern ) 时遇到编译器错误,当基类(显式)可转换为 bool 时, 也可类型转换到 Derived类型。如果我尝试输出 Derived,则会出现编译器错误使用 ostream 作为右值键入.例如:

    #include <iostream>
using namespace std;

template <class Object>
class Base
{
private:

typedef void (Base::*explicit_bool_type)() const;

void explicit_bool_idiom() const { }

public:

operator explicit_bool_type() const
{
return &Base::explicit_bool_idiom;
}

operator Object& ()
{
return Object();
}

operator const Object& () const
{
return Object();
}
};

class Derived : public Base<Derived>
{
public:

friend std::ostream& operator << (std::ostream& os, const Derived& d)
{
os << "abc";
return os;
}
};

int main()
{
std::cout << Derived() << std::endl;
}

这给出了编译器错误:

test2.cpp:42: error: ambiguous overload for ‘operator<<’ in ‘std::cout << Derived()’
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:102: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
test2.cpp:32: note: std::ostream& operator<<(std::ostream&, const Derived&)

问题:这是编译器错误吗?我怀疑它可能是,因为它只出现在旧版本的 GCC 上,比如 GCC 4.1.2。使用 GCC 4.8.2,它工作正常。不幸的是,我需要让它在旧的编译器上工作。如果我重载 std::ostream& operator <<对于 Derived , 有用。 (如果我将 Derived 的实例输出为左值,它也有效。)

我不确定为什么编译器认为 std::ostream::operator << (bool)是一个同样有效的候选人。

此外,我知道显式 bool 习语在 C++11 中已过时 - 同样,需要让它在旧的编译器上工作。

有没有办法在不重载的情况下解决歧义std::ostream& operator <<对于 Derived

最佳答案

这确实是 g++ 4.1 中的一个错误。它至少在 4.2.3 及更高版本中有效。

此外,如果您删除隐式转换为 explicit_bool_type 或两个 Object& 转换,它编译正常。我强烈反对隐式向下转型是一个坏主意(假设您的实际实现实际上不通过引用返回堆栈变量)并且建议删除这些运算符,这样还有修复编译错误的额外好处。

关于c++ - CRTP 的模糊过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com