概念没有按预期解决歧义。代码示例有什么问题?



我尝试了 c++ 概念。尝试通过使用概念来消除模板"using"子句的歧义。下面是一个简化的示例:

namespace A {
template <typename T>
class Array
{
    public:
        typedef double ElementType;
        Array() {}
        ElementType *data() { return nullptr; }
};
template <typename E>
concept bool Engine =
requires(E e) { {e.data()} -> typename E::ElementType *; };
template <typename E>
requires Engine<E>
class Container
{
    public:
        Container() {};
};
} // namespace A
namespace B {
template <typename T>
using Container = A::Container<A::Array<T>>;
} // namespace B
int main()
{
    using namespace A;
    using namespace B;
    Container<double> d;
    return 0;
}

这将产生以下错误:

cio.cc: In function 'int main()':
cio.cc:40:3: error: reference to 'Container' is ambiguous
   Container<double> d;
   ^~~~~~~~~
cio.cc:20:7: note: candidates are: 'template<class E>  requires      Engine<E> class A::Container'
 class Container
   ^~~~~~~~~
cio.cc:31:44: note:                 'template<class T> using Container = A::Container<A::Array<T> >'
 using Container = A::Container<A::Array<T>>;
                                        ^
cio.cc:40:13: error: expected primary-expression before 'double'
   Container<double> d;

那么为什么 A::Container 被认为是 Container 的候选者呢?double 不符合这些概念。我错在哪里?

C++20 Concepts不支持该用例。我们有函数的重载解析,但我们没有像这样的类型或别名的重载解析。

Container<dobule>必须提到一件事,但它可能是A::Container的,也可能是B::Container......所以这是格式错误的。此处没有"检查此特定类模板是否满足约束"步骤。

相关内容

  • 没有找到相关文章

最新更新