模板功能默认参数

时间:2015-02-12 23:44:52

标签: c++ templates constructor default

//template.h using MSVC++ 2010
#pragma  once
#include <iostream>
using std::ostream;
template <typename T, typename U> class Pair {
  private:
    T first;
    U second;

  public:

    // Pair() ;
    Pair ( T x = T() , U y = U() ) ;
    template<typename T, typename U> 
    friend ostream& operator<< ( ostream& thisPair, Pair<T, U>& otherPair );

};
template <typename T, typename U> 
Pair<T, U>::Pair ( T x , U y ) : first ( T ( x ) ), second ( U ( y ) ) 
{cout << x << y;}

template <typename T, typename U> 
ostream& operator<< ( ostream& os, Pair<T, U>& otherPair )
{
    os << "First: " << otherPair.first 
<< " "<< "Second: " << otherPair.second << endl;
    return os;
}

//template.cpp
int main()
{
    int a = 5, b = 6;
    Pair<int,int> pair4();
    Pair<int, int> pair1 ( a, b );
    cout<<pair4;
    cout<<pair1;
    return 0;
}

如何使构造函数或成员函数采用默认值? 上面的代码在使用cout语句时为pair4提供了链接器错误。 当cout&lt;&lt; pair4();时,代码可以正常工作被评论。 我试图模仿一个构造函数使用模板类中的单个默认构造函数获取0,1或2参数。

1 个答案:

答案 0 :(得分:3)

除了阴影模板参数之外的其他错误(MSVC ++错误地忽略了),问题出在这里:

Pair<int,int> pair4();

这声明了一个函数而不是一个变量。这是因为它可以在语法上兼容,C ++标准选择最令人烦恼的解析:任何可以被编译器解释为声明的东西都将被解释为声明。然后,链接器错误是您尝试打印到从未定义的函数的cout地址(没有地址)。

附注:在GCC和Clang中,您实际上可以链接它,因为bool的地址立即转换为operator <<(没有用于打印函数指针的运算符ostreambool是唯一可用的隐式转换),它总是会导致true(声明函数的地址永远不会是nullptr),因此地址本身会被优化掉。

修复非常简单:

Pair<int,int> pair4;