概念并没有像预期的那样解决歧义。什么';代码示例出了什么问题? 我用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; } 名称空间A{ 模板 类数组 { 公众: typedef双元素类型; 数组(){} ElementType*data(){return nullptr;} }; 模板 概念布尔发动机= 需要(E){E.data()}->typename E::ElementType*;}; 模板 需要发动机 类容器 { 公众: 容器(){}; }; }//名称空间A 命名空间B{ 模板 使用Container=A::Container; }//名称空间B int main() { 使用名称空间A; 使用名称空间B; 容器d; 返回0; }

概念并没有像预期的那样解决歧义。什么';代码示例出了什么问题? 我用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; } 名称空间A{ 模板 类数组 { 公众: typedef双元素类型; 数组(){} ElementType*data(){return nullptr;} }; 模板 概念布尔发动机= 需要(E){E.data()}->typename E::ElementType*;}; 模板 需要发动机 类容器 { 公众: 容器(){}; }; }//名称空间A 命名空间B{ 模板 使用Container=A::Container; }//名称空间B int main() { 使用名称空间A; 使用名称空间B; 容器d; 返回0; },c++,gcc,c++-concepts,c++20,C++,Gcc,C++ Concepts,C++20,这会产生以下错误: 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::Conta

这会产生以下错误:

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;
cio.cc:在函数“int main()”中:
cio.cc:40:3:错误:对“容器”的引用不明确
容器d;
^~~~~~~~~
cio.cc:20:7:注意:候选项是:“模板需要引擎类A::容器”
类容器
^~~~~~~~~
cio.cc:31:44:注意:'template using Container=A::Container'
使用Container=A::Container;
^
cio.cc:40:13:错误:应在“double”之前使用主表达式
容器d;

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

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


Container
必须引用一个东西,但它可以是
A::Container
B::Container
。。。所以这是不正确的。这里没有“检查这个特定的类模板是否满足约束”步骤

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


Container
必须引用一个东西,但它可以是
A::Container
B::Container
。。。所以这是不正确的。这里没有“检查这个特定的类模板是否满足约束”步骤

什么是
DenseVector
?“我哪里错了?”您为不同名称空间中的两个对象指定了相同的名称,然后将这两个名称导入到同一位置。不要那样做。DenseVector有点“打字错误”。很抱歉修复了它。什么是
DenseVector
?“我错在哪里了?”您在不同名称空间中为两个对象赋予了相同的名称,然后将两个名称导入到同一位置。不要那样做。DenseVector有点“打字错误”。很抱歉在我对模板解析的天真理解中,我会这样想:我们在main()中有容器。有一个模板类容器和一个using子句。模板类不满足约束,因此没有候选对象。因此,用户被留作候选者并被选择。你能告诉我它真正的选择方式吗(我知道我的解释是非常简单的)@AlexanderStippler就像我说的,没有“模板类不满足约束,因此没有候选”步骤。只有“有一个模板类容器和一个using子句”步骤-因此不明确。@AlexanderStippler查找类型之类的名称实际上非常简单。你在范围内向外走,直到找到什么。如果您找到了一个类型/对象,那么您就完成了。如果发现两个或零个类型/对象,则表示格式错误。只有在函数的情况下,我们才会使用依赖参数的查找和重载解析。但我不喜欢这种行为。如果没有using子句,A::Container将导致“约束不满足”,因此被编译器拒绝,并且在添加using子句时,这是产生歧义的原因。这与IHOO并不匹配。“Alxand”ToPrPult只在C++中运行过负荷,其他任何事情都不这样做。在我对模板解析的天真理解中,我会这样想:我们在main()中有容器。有一个模板类容器和一个using子句。模板类不满足约束,因此没有候选对象。因此,用户被留作候选者并被选择。你能告诉我它真正的选择方式吗(我知道我的解释是非常简单的)@AlexanderStippler就像我说的,没有“模板类不满足约束,因此没有候选”步骤。只有“有一个模板类容器和一个using子句”步骤-因此不明确。@AlexanderStippler查找类型之类的名称实际上非常简单。你在范围内向外走,直到找到什么。如果您找到了一个类型/对象,那么您就完成了。如果发现两个或零个类型/对象,则表示格式错误。只有在函数的情况下,我们才会使用依赖参数的查找和重载解析。但我不喜欢这种行为。如果没有using子句,A::Container将导致“约束不满足”,因此被编译器拒绝,并且在添加using子句时,这是产生歧义的原因。这与IHOO并不匹配。“Alxand”ToPrPult只在C++中运行过负荷,其他任何事情都不这样做。这是极不可能改变的。