概念没有按预期解决歧义。代码示例有什么问题?
Concept does not resolve ambiguity as expected. What's wrong with the code sample?
我尝试使用 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 概念不支持该用例。我们有函数的重载解析,但我们没有像这样的类型或别名的重载解析。
Container<dobule>
必须指代一件事,但它可能是 A::Container
或 B::Container
... 所以它的格式不正确。这里没有 "check if this particular class template satisfies the constraints" 步骤。
我尝试使用 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 概念不支持该用例。我们有函数的重载解析,但我们没有像这样的类型或别名的重载解析。
Container<dobule>
必须指代一件事,但它可能是 A::Container
或 B::Container
... 所以它的格式不正确。这里没有 "check if this particular class template satisfies the constraints" 步骤。