3

如何将第二个参数声明为可选?

template <typename T>
inline void Delete (T *&MemoryToFree,
    T *&MemoryToFree2 = ){
    delete MemoryToFree;
    MemoryToFree = NULL;

    delete MemoryToFree2;
    MemoryToFree2 = NULL;

}

我在 = 运算符之后尝试了几件事,例如 NULL、(T*)NULL 等。可以这样做吗?

编译器让我这样做的唯一方法是使用重载......

    template <typename T, typename T2>
inline void Delete (T *&MemoryToFree, T2 *&MemoryToFree2){
    delete MemoryToFree;
    MemoryToFree = NULL;

    delete MemoryToFree2;
    MemoryToFree2 = NULL;
}
4

4 回答 4

12

你可以重载函数

template <typename T>
inline void Delete (T *&MemoryToFree){
        delete MemoryToFree;
        MemoryToFree = NULL;
}

template <typename T, typename T2>
inline void Delete (T *&MemoryToFree, T2 *&MemoryToFree2){
        delete MemoryToFree;
        MemoryToFree = NULL;

        delete MemoryToFree2;
        MemoryToFree2 = NULL;
}
于 2009-10-16T18:47:17.793 回答
8

您始终可以编写一个简单的“按需静态左值生成器”并将其用作参数的默认值

template <typename T> inline T& get_lvalue() {
  static T t;
  return t;
}

在您的代码中

template <typename T> 
inline void Delete(T *&MemoryToFree, T *&MemoryToFree2 = get_lvalue<T*>())
于 2009-10-17T00:30:12.313 回答
2

不,这是不可能的。您不能将默认参数与引用一起使用。

于 2009-10-16T18:47:24.490 回答
0

以下代码适用于我使用 gcc 4.3.2。

void fn( int*const & i = 0 )
{
    delete i;
}

所以也许你可以适应它。您需要*const允许默认参数。对 const 的引用允许使用默认参数。

编辑

刚刚意识到标记它对*const您没有用,因为您希望能够将指针以及指针设为空delete

于 2009-10-16T19:03:17.253 回答