gpt4 book ai didi

c++ - 这个c++模板代码有效吗? g++ 编译它但 clang 不会

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:55 25 4
gpt4 key购买 nike

我正在尝试使用 clang 和 Fedora 上的默认 C++ 标准库 (4.6.2) 编译一个小的 C++ 程序。 Clang 本身编译正常,仅使用编译和运行的测试程序也正常。

我的其他程序使用了 clang 提示的绳索。

/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../../include/c++/4.6.2/ext/ropeimpl.h:433:2: error: use of undeclared identifier '_Data_allocate' _Data_allocate(_S_rounded_up_size(__old_len + __len));

A bug已针对此错误消息对 clang 进行了归档,解决方案是 clang 是正确的,库代码无效。

Clang is correct here. There are no type-dependent arguments in the call to _Data_allocate, so name lookup fails at template definition time.

失败代码的上下文:

  // Concatenate a C string onto a leaf rope by copying the rope data.
// Used for short ropes.
template <class _CharT, class _Alloc>
typename rope<_CharT, _Alloc>::_RopeLeaf*
rope<_CharT, _Alloc>::
_S_leaf_concat_char_iter(_RopeLeaf* __r, const _CharT* __iter, size_t __len)
{
size_t __old_len = __r->_M_size;
_CharT* __new_data = (_CharT*)
_Data_allocate(_S_rounded_up_size(__old_len + __len));
_RopeLeaf* __result;

uninitialized_copy_n(__r->_M_data, __old_len, __new_data);
uninitialized_copy_n(__iter, __len, __new_data + __old_len);
_S_cond_store_eos(__new_data[__old_len + __len]);
__try
{
__result = _S_new_RopeLeaf(__new_data, __old_len + __len,
__r->_M_get_allocator());
}
__catch(...)
{
_RopeRep::__STL_FREE_STRING(__new_data, __old_len + __len,
__r->_M_get_allocator());
__throw_exception_again;
}
return __result;
}

我的问题是,如果此代码无效,是否有简单的解决方法? g++ 可以编译这个。

最佳答案

通过 libstdc++ 源代码挖掘,似乎成员函数的定义 _Data_allocate __ROPE_DEFINE_ALLOCS 扩展的结果模板定义中的宏_Rope_base (注意模板实例化 rope<_CharT, _Alloc> 公开扩展了 _Rope_base<_CharT, _Alloc> )。

您可以尝试限定对 _Data_allocate 的调用更远。而不是:

_Data_allocate(_S_rounded_up_size(__old_len + __len));

尝试:

_Rope_base<_CharT, _Alloc>::_Data_allocate(_S_rounded_up_size(__old_len + __len));

或者简单地说:

_Base::_Data_allocate(_S_rounded_up_size(__old_len + __len));

因为 protected typedef _Rope_base<_CharT, _Alloc> _Base;rope<_CharT, _Alloc> 的定义中.

编辑:我没有在本地安装 Clang,但我用 online Clang 3.0 compiler demo 测试了它.

这个高度精简的版本无法使用 Clang 3.0 进行编译(错误:使用未声明的标识符“_Data_allocate”):

#include <cstddef>
#include <memory>

template <typename _CharT, class _Alloc>
class _Rope_base : public _Alloc
{
public:
typedef typename _Alloc::template rebind<_CharT>::other _DataAlloc;
static _CharT * _Data_allocate(std::size_t __n) {
return _DataAlloc().allocate(__n);
}
};

template <typename _CharT, class _Alloc = std::allocator<_CharT> >
class rope : public _Rope_base<_CharT, _Alloc>
{
protected:
typedef _Rope_base<_CharT, _Alloc> _Base;

public:
rope()
{
_Data_allocate(0);
}
};

int main()
{
rope<char> r;
}

通过限定对 _Data_allocate 的调用无论采用上面建议的哪种方式,Clang 3.0 都可以成功编译它。

关于c++ - 这个c++模板代码有效吗? g++ 编译它但 clang 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662083/

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