这是c++;模板代码有效吗?g++;编译它,但clang won';T 我试图用FiDORA中的默认C++标准库(4.62)使用CLAN编译一个小型C++程序。Clang本身编译正常,而只使用Clang的测试程序编译并运行良好
我的另一个程序使用了clang抱怨的绳索 /usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../../../../../../include/c++/4.6.2/ext/ropeimpl.h:433:2: 错误:使用 未声明的标识符“\u数据\u分配” _数据分配(_S_四舍五入大小(_旧长度+_长度)) 对于此错误消息,已针对clang提交了一份解决方案,该解决方案是clang是正确的,库代码无效 叮当声在这里是正确的。中没有依赖于类型的参数 召唤 _数据分配,因此名称查找在模板定义时失败 失败代码的上下文:这是c++;模板代码有效吗?g++;编译它,但clang won';T 我试图用FiDORA中的默认C++标准库(4.62)使用CLAN编译一个小型C++程序。Clang本身编译正常,而只使用Clang的测试程序编译并运行良好,c++,templates,clang,libstdc++,C++,Templates,Clang,Libstdc++,我的另一个程序使用了clang抱怨的绳索 /usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../../../../../../include/c++/4.6.2/ext/ropeimpl.h:433:2: 错误:使用 未声明的标识符“\u数据\u分配” _数据分配(_S_四舍五入大小(_旧长度+_长度)) 对于此错误消息,已针对clang提交了一份解决方案,该解决方案是clang是正确的,库代码无效 叮当声在这里是正确的。中没有依赖于类型的参数 召唤 _
// 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;
}
//通过复制rope数据将C字符串连接到叶子rope上。
//用于短绳。
模板
typename rope::\u RopeLeaf*
绳子::
_S_-leaf_-concat_-char_-iter(_-RopeLeaf*_-r,结构图*_-iter,尺寸)
{
大小\u t\u旧\u len=\u r->\u M\u大小;
_图表*\u新数据=(\u图表*)
_数据分配(_S_四舍五入大小(_旧长度+_长度));
_RopeLeaf*\u结果;
未初始化的复制数据(\uuu r->\u M\u数据、\uu旧数据、\uu新数据);
未初始化的拷贝(iter,len,new,data+,old);
_S_cond_store_eos(u new_data[u old_len+u len]);
__试一试
{
__结果=\u S\u new\u RopeLeaf(\u new\u data,\u old\u len+\u len,
__r->_M_get_分配器());
}
__捕获(…)
{
_RopeRep::uuu STL_ufree_ustring(uuu new_udata,uuu old_ulen+u len,
__r->_M_get_分配器());
__再次抛出异常;
}
返回结果;
}
我的问题是,如果此代码无效,是否有简单的解决方法?g++编译这个代码是正确的 通过libstdc++源代码挖掘,似乎成员函数
\u Data\u allocate
的定义是由模板\u ROPE\u base
定义中的\u ROPE\u ALLOCS
宏扩展而来的(请注意,模板实例化ROPE
公开扩展\u ROPE\u base
)
您可以尝试进一步限定调用\u Data\u allocate
。而不是:
_Data_allocate(_S_rounded_up_size(__old_len + __len));
尝试:
由于受保护的typedef\u-Rope\u-base\u-base在rope
定义中的code>
EDIT:我没有在本地安装Clang,但我使用了测试
此高度精简的版本无法使用Clang 3.0编译(错误:使用未声明的标识符“\u Data\u allocate”):
#包括
#包括
模板
等级(绳索)(基础):公共(Alloc)
{
公众:
typedef typename _Alloc::template rebind::other _DataAlloc;
静态图表*\u数据\u分配(标准::大小\u t\n){
返回_DataAlloc().allocate(u\n);
}
};
模板
类绳:公共绳座
{
受保护的:
类型定义(绳索)底座(底座);;
公众:
绳子()
{
_数据分配(0);
}
};
int main()
{
钢丝绳;
}
通过上述方式将调用限定为<代码>“数据DATAX分配/代码>”,CLAN 3成功编译它。
您是否考虑在Bug报告上添加?+ 1,如果您要修复该库,您也可以使用this
:this->\u Data\u allocate
将调用限定为从属名称,这意味着解析将推迟到参数替换和在基本模板中找到正确的成员函数时进行。另一个解决方案是使用_Base::_Data\u allocate添加
到rope
类模板,这将使基函数进入作用域。我尝试了此->但clang抱怨“错误:在非静态成员函数之外无效使用'this'。@Daniel:adding使用_base::_Data\u allocate代码>在CLAN演示页面上为我工作(如它应该)。为了参考,这个问题在第43项中讨论:“如何在模板化的基类中访问名称”,这是Scott Meyers的第三版的有效C++。并假设\u Data\u allocate
是\u Base
的成员函数,并且它是从另一个成员函数调用的。如果成员函数是静态的,不起作用,如果正在执行调用的函数是静态的,则也不存在此
。
_Rope_base<_CharT, _Alloc>::_Data_allocate(_S_rounded_up_size(__old_len + __len));
_Base::_Data_allocate(_S_rounded_up_size(__old_len + __len));
#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;
}