【问题标题】:How to define a nested member template outside a class template?如何在类模板之外定义嵌套成员模板?
【发布时间】:2010-10-21 11:09:29
【问题描述】:

考虑以下类模板:

template <class T>
class MyClass
{
   void MyFunc();
};

template <class T>
void MyClass<T>::MyFunc()
{
  //...implementation goes here
}

我需要添加另一个函数模板MyFunc2,它接受模板参数T2 即,

template <class T>
class MyClass
{
   void MyFunc();

   template <class T2>
   static void MyFunc2(T2* data);
};

template <class T>
void MyClass<T>::MyFunc()
{
  //...implementation goes here
}

template <class T, class T2>
void MyClass<T>::MyFunc2(T2* pData)  // error here
{
  //...implementation goes here
}

我正在使用 VS 2008 编译器。我收到错误消息:

错误 C2244:无法将函数定义与现有声明匹配

在这种情况下,函数的定义和声明应该是什么样子?

【问题讨论】:

  • 通常情况下,在类模板定义中定义内联模板成员函数以避免所有这些小问题会更容易。

标签: c++ templates


【解决方案1】:
template <class T>
template <class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
  //...implementation goes here 
}

$14.5.2/1 - “模板可以是 在类或类中声明 模板;这样的模板称为 成员模板。成员模板可以 在其类之内或之外定义 定义或类模板 定义。 一个成员模板 在外部定义的类模板 其类模板定义应 与指定 类的模板参数 模板后跟 成员的模板参数 模板。"

【讨论】:

  • 我一直觉得这种语法很尴尬,嵌套类也不会变得更好......
  • @Chubsdad:原始模板化成员函数声明中的 static 关键字怎么样?在实现中放弃它是否有效?
【解决方案2】:

你做的很好,试试这个:

template <typename S,typename T>
struct Structure
{
  S s ;
  T t ;

} ;

int main(int argc, const char * argv[])
{
  Structure<int,double> ss ;
  ss.s = 200 ;
  ss.t = 5.4 ;

  return 1;
}

此代码有效。如果您遇到奇怪的错误,请查看您是否转发声明 Structure 仅使用 1 个模板参数(我就是这样做的)。

【讨论】:

    【解决方案3】:

    试试这个:

    template <class T, class T2>
    class MyClass
    {
    public:
        static void MyFunc2(T2* data);
    };
    
    template <class T, class T2>
    void MyClass<T, T2>::MyFunc2(T2* pData)
    {
        cout << "dummy " << *pData<< "\n";
    }
    

    然后

    int main()
    {
        cout << "Hello World!\n"; 
        MyClass<int, int> a;
        int *b = (int*)malloc(sizeof(int));
        *b = 5;
        a.MyFunc2(b);
    }
    

    输出

    Hello World!
    dummy 5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      相关资源
      最近更新 更多