首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >概念没有像预期的那样解决歧义。代码示例有什么问题?

概念没有像预期的那样解决歧义。代码示例有什么问题?
EN

Stack Overflow用户
提问于 2019-02-02 00:20:21
回答 1查看 92关注 0票数 0

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

代码语言:javascript
复制
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;
}

这会产生以下错误:

代码语言:javascript
复制
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不符合这些概念。我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-02 00:23:10

C++20概念就是不支持这种用例。我们有函数的重载解析,但我们没有这样的类型或别名的重载解析。

Container<dobule>必须指一件事,但它可以是A::ContainerB::Container...所以这是病态的。这里没有“检查这个特定的类模板是否满足约束”步骤。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54483306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档