0

我正在尝试将 C++ 项目移植到 iOS。它在 Linux 和 Windows 以及 MSVC 上的 QtCreator 中编译得很好。现在在 Xcode/GCC 上,使用某个模板类我得到以下错误:“错误:模板参数列表太少”。

导致此错误的代码如下所示:

template <typename TA, typename TB, int Type>
class MyClassImpl
{
public:
   MyClassImpl();
   virtual int GetType() const
   {
       return type;
   }
};    

typedef MyClassImpl<float, int, 12> MyFloatIntClass;

MyFloatIntClass::MyFloatIntClass()
{
...
}

int MyFloatIntClass::GetType() const
{
   return 22;
}

我猜想关于 typedef 语法的某些东西是非法的,而 GCC 对标准的要求更严格。谁能告诉我到底是什么问题以及如何解决?

4

2 回答 2

4

当您定义相应类的方法的完整特化时,您仍然需要在定义前加上template <>,这是您缺少的“模板参数列表”。此外,构造函数必须按类命名,因此MyFloatIntClass::MyFloatIntClass()是非法MyFloatIntClass的(因为只是别名,而不是类名)。以下对我来说编译得很好(g ++ 4.5.3):

template <typename TA, typename TB, int Type>
class MyClassImpl
{
public:
   MyClassImpl();
   virtual int GetType() const
   {
       return Type;
   }
};    

typedef MyClassImpl<float, int, 12> MyFloatIntClass;

template <>
MyFloatIntClass::MyClassImpl()
{
}

template <>
int MyFloatIntClass::GetType() const
{
   return 22;
}
于 2012-04-09T16:52:22.260 回答
3

这只是一个猜测,但是您需要添加模板<>吗?

既然是模板专业化,我相信还是需要模板的。

前任。

template<>
MyFloatIntClass::MyClassImpl() {}

template<>
int MyFloatIntClass::GetType() const {
    return 22;
}

编辑:从modelnine的回答中发现它需要ctor的未定义名称。

EDIT2:以下代码对我来说很好:

template <typename TA, typename TB, int Type>
class MyClassImpl
{
public:
   MyClassImpl();
   MyClassImpl(const MyClassImpl<TA, TB, Type>&);
   virtual int GetType() const
   {
       return Type;
   }
   const MyClassImpl<TA, TB, Type>& operator=(const MyClassImpl<TA, TB, Type>&);
};    

typedef MyClassImpl<float, int, 12> MyFloatIntClass;

template<>
MyFloatIntClass::MyClassImpl()
{
 //
}

template<>
MyFloatIntClass::MyClassImpl( const MyFloatIntClass& rhs )
{
 //
}

template<>
const MyFloatIntClass& MyFloatIntClass::operator=( const MyFloatIntClass& rhs )
{
  return *this;
}

template<>
int MyFloatIntClass::GetType() const
{
   return 22;
}
于 2012-04-09T16:47:24.980 回答