gpt4 book ai didi

c++ - 为什么 CRTP(奇怪的递归模板模式)试图选择另一个私有(private)基类的另一个同名函数?

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:51 24 4
gpt4 key购买 nike

我正在学习 C++ 中的 CRTP(奇怪的递归模板模式)。

为了学习CRTP,我做了如下代码。

代码只是试图通过 CRTP 的另一个基类从一个基类获取迭代器。

问题是 gcc 编译器无法在下面的 test_get_iterator_by_crtp() 中选择函数 GET_CONTAINRE_ITERATOR_CRTP::begin()。似乎 gcc 混淆了 GET_CONTAINRE_ITERATOR_CRTP<(int)> 和 ContainerIterator<(int)> 的 begin() 因为当我将 GET_CONTAINRE_ITERATOR_CRTP<(int)>::begin() 的名称更改为 begin_another() 时错误消失了。

我期待 ci.template begin(); below 不能是 ContainerIterator::begin() 因为它是作为私有(private)基类实现的,我们不能直接访问它。

请有人告诉我为什么 begin() 不明确。如果我犯了一个简单的错误或误解,请原谅我。非常感谢。

template <typename T>
class ContainerIterator : public std::vector<T> {
public:
auto begin(void) {
return std::vector<T>::begin();
}
};

template <typename Derived>
class GET_CONTAINRE_ITERATOR_CRTP {
public:

template <typename T>
auto begin(void) {
Derived* host = static_cast<Derived*>(this);
// The following line makes a compile error of ambiguous name, begin().
return host->template ContainerIterator<T>::begin();
}
};

// CI = Container Iterator
class CI : private ContainerIterator<int>, public GET_CONTAINRE_ITERATOR_CRTP<CI> {
public:
friend class GET_CONTAINRE_ITERATOR_CRTP<CI>;
};

void test_get_iterator_by_crtp(void) {
CI ci{};
auto it = ci.template begin<int>();
}

错误信息:

error: request for member ‘begin’ is ambiguous

最佳答案

你应该明确地告诉编译器基模板类将实现方法begin() .在你的里面CI class 你可以通过添加一个 using 来完成公共(public)部分说明:

using GET_CONTAINRE_ITERATOR_CRTP<CI>::begin;

默认情况下,编译器会合理建议 GET_CONTAINRE_ITERATOR_CRTP 的一些特化模板可以在没有begin()的情况下实现方法。有关更多信息,您可以引用 Scott Meyers 的第 43 项(“Effective C++”)

更新: using GET_CONTAINRE_ITERATOR_CRTP<CI>::begin;会有所帮助。但这种行为的主要原因是 GCC 完成“名称查找”和“访问检查”的顺序。根据标准:The access rules (Clause 11) are considered only once name lookup and function overload resolution (if applicable) have succeeded.这导致模棱两可的问题 begin姓名。目前尚不清楚 Clang 的行为是否不同。

关于c++ - 为什么 CRTP(奇怪的递归模板模式)试图选择另一个私有(private)基类的另一个同名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42933536/

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