C++模板、方法原型和实现

C++ templates, method prototypes and implementation

本文关键字:实现 原型 方法 模板 C++      更新时间:2023-10-16

我在header.h++文件中有以下内容:

template<typename N, 
         typename V = int, 
         typename C = std::less<N>, 
         typename A = std::allocator<N>>
class my_class {
  public:
    ...
  private:
    N* buy_node_( const V& );
    ...
};

在实现.c++文件中,我有

template <typename N, typename V, typename C, typename A>
typename my_class<N, V, C, A>::N* 
my_class<N, V, C, A>::buy_node_( const V& v )
{
  ...
}

但这给了我一个错误:

error: prototype for ... does not match any in class ...

然而,如果我改为这样做,在标题中:

template<typename N, 
         typename V = int, 
         typename C = std::less<N>, 
         typename A = std::allocator<N>>
class my_class {
  public:
    ...
  private:
    typedef N node_t;
    N* buy_node_( const V& );
    ...
};

这在实现中:

template <typename N, typename V, typename C, typename A>
typename my_class<N, V, C, A>::node_t* 
my_class<N, V, C, A>::buy_node_( const V& v )
{
  ...
}

它编译得很好。我很好奇为什么我需要typedef?

行:

typename my_class<N, V, C, A>::N*

正在尝试引用my_class中的typedef,但my_class未定义此类typedef。在这种情况下,typename关键字用于表示"这是typedef"(例如typedef T::value)。

第二个版本的工作原理是node_t是typedef,node_tN是等价的。

由于N是模板的一部分,您可以简单地说:

N*