C++ C++;:“错误”;非命名空间范围中的显式专门化”; 模板 类Bimap{ 公众: 类数据{ 私人: 模板数据集(T); 模板数据和集(typename T1 v){/*…*/} }; };
这给了我一个错误:C++ C++;:“错误”;非命名空间范围中的显式专门化”; 模板 类Bimap{ 公众: 类数据{ 私人: 模板数据集(T); 模板数据和集(typename T1 v){/*…*/} }; };,c++,templates,C++,Templates,这给了我一个错误: 错误:在非命名空间范围“class Bimap::Data”中显式专门化 我明白错误在说什么。但为什么我不能这么做?如何修复它?单向忘记模板,重载: template<typename T1, typename T2> class Bimap { public: class Data { private: template<typename T> Data& set(T); template<
错误:在非命名空间范围“class Bimap::Data”中显式专门化
我明白错误在说什么。但为什么我不能这么做?如何修复它?单向忘记模板,重载:
template<typename T1, typename T2>
class Bimap {
public:
class Data {
private:
template<typename T> Data& set(T);
template<> Data& set<T1>(typename T1 v) { /*...*/ }
};
};
但这里有一个技巧,我有时会用到
您可以在类中专门化类模板:
Data& set(T1 v) { /*...*/ }
类{
模板
结构函数{
静态空隙率(T);
};
模板
结构函数{
...
};
模板
空函数(T){返回函数(T)::apply(T);}
@Albert
当我想向定制容器添加“修剪过剩容量”时,我遇到了类似的问题。std::vector交换技巧和更改现有容器的声明都是无效的选项。因此我提出了以下建议:
class {
template<typename T>
struct function_ {
static void apply(T);
};
template<>
struct function_<int> {
...
};
template<typename T>
void function(T t) { return function_<T>::apply(t); }
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数);
};
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数){}
};
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数)
{
对于(未签名int i=0),我注意到一些编译器将支持这个。在C++中,您不显式专门化成员模板而不显式地封闭封闭类模板。要做到这一点是不可能的。你必须使用重载。或者完全重新设计整件事。MSVC++是一个编译器,它允许将此作为一个扩展。+1,是的,这是唯一正确实现函数模板专门化的明智方法。你可以显式地专门化普通类中的嵌套类模板。但你不能显式专门化一个nested类模板在另一个类模板中。实现后者的唯一方法是显式地专门化封闭模板和嵌套模板。@Andrey我不确定模板类中的模板类。无论如何,可能会有一些变化
template <class T, bool isPtr> struct DeleteImp
{
static void Trim(T* to, unsigned int count);
};
template <class T> struct DeleteImp<T, false>
{
static void Trim(T* to, unsigned int count) {}
};
template <class T> struct DeleteImp<T, true>
{
static void Trim(T* to, unsigned int count)
{
for(unsigned int i=0; i<count; i++)
delete to[i];
}
};
DeleteImp<T, TypeTraits<T>::isPointer>::Trim(buf + length, truelength-length);