Mar*_*ark 121 c++ gcc templates
template<typename T>
class CConstraint
{
public:
    CConstraint()
    {
    }
    virtual ~CConstraint()
    {
    }
    template <typename TL>
    void Verify(int position, int constraints[])
    {       
    }
    template <>
    void Verify<int>(int, int[])
    {   
    }
};
在g ++下编译它会产生以下错误:
非命名空间范围'类CConstraint'中的显式特化
在VC中,它编译得很好.任何人都可以让我知道解决方法吗?
Geo*_*che 92
在这种情况下,VC++是不兼容的 - 显式特化必须在命名空间范围内.C++ 03,§14.7.3/ 2:
应在模板所属的名称空间中声明显式特化,或者对于成员模板,在封闭类或封闭类模板所属的名称空间中声明.
应该在类模板所属的名称空间中声明类模板的成员函数,成员类或静态数据成员的显式特化.
另外,由于C++ 03,§14.7.3/ 3,你有一个问题就是你不能专门化成员函数而没有明确地专门化包含类,所以一个解决方案是Verify()提供一个可能是专门的免费函数:
namespace detail {
    template <typename TL> void Verify     (int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}
template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};
Joh*_*itb 89
解决它的另一种方法是委托私有函数并重载该函数.这样,您仍然可以访问*this外部模板参数类型的成员数据.
template<typename T>
struct identity { typedef T type; };
template<typename T>
class CConstraint
{
public:
  template <typename TL>
  void Verify(int position, int constraints[])
  {
    Verify(position, constraints, identity<TL>());
  }
private:
  template<typename TL>
  void Verify(int, int[], identity<TL>)
  {
  }
  void Verify(int, int[], identity<int>)
  {
  }
};
更好的是:您可以将部分专业化与默认模板参数结合使用。用这种方法对VC ++代码的修改很小,因为不需要修改对专用函数的调用。
template <typename TL, class Dummy=int>
void Verify(int position, int constraints[])
{
}
template <class Dummy=int>
void Verify<int, Dummy>(int, int[])
{
}
| 归档时间: | 
 | 
| 查看次数: | 75262 次 | 
| 最近记录: |