c++ 03 class template 这是转换构造函数还是转换运算符?以及如何声明解决这个问题的方法?

c++ 03 class template Is this a conversion constructor or conversion operator? and how to declare the method to solve this?

我在这一行中遇到问题 多项式 p2( pf_1 );

我不知道是转换构造函数还是转换运算符以及如何处理不同类型但大小相同的模板

    std::cout << "-------- " << __func__ << " --------\n";
    Polynomial<float,2> pf_1;
    pf_1[0] = 1.1;
    pf_1[1] = -2.2;
    pf_1[2] = 1.1;
    std::cout << pf_1 << std::endl;

    Polynomial<int,2> p2( pf_1 ); // convert
    std::cout << p2 << std::endl;

template< typename T, int N > 
class Polynomial
{
  public:
    friend std::ostream& operator<< <T, N>( std::ostream &out, Polynomial<T, N> const& pol );
    Polynomial();
    T& operator[](int pos);


    T GetDegree(int pos)const;
    void SetDegree(int pos, T value);

  private:
    T coeff[N];

};

来自(浮动) 1.1 -2.2*x^1 +1.1*x^2

转换为(整数)

1 -2*x^1 +x^

转换构造函数或转换运算符都可以在这里工作。但是当两者都可能时,转换构造函数通常更直接。

因此,您希望像 Polynomial<int, 2> 这样的单一类型可以从其他类型家族(包括 Polynomial<double, 2>Polynomial<short int, 2>)转换而来。这表明您不仅需要一个简单的转换构造函数,还需要一个成员模板构造函数。度数 N 应与 class 模板保持相同,但我们为源系数类型引入了一个新的类型参数:

template< typename T, int N >
class Polynomial
{
public:
    template< typename U >
    explicit Polynomial(const Polynomial<U, N>& src);
    // ...
};

我已将其标记为 explicit,这将支持您的 Polynomial<int,2> p2( pf_1 ); 示例,但禁止隐式转换。这取决于您,但隐式转换有时会导致不幸的意外。

如果构造函数模板将定义在class模板之外,注意您需要列出class模板参数,然后列出成员模板参数来编写定义:

template< typename T, int N > template< typename U >
Polynomial<T, N>::Polynomial(const Polynomial<U, N>& src) : // ...