0

重複の可能性:
テンプレート演算子オーバーロード関数の未定義シンボル

これが私のソースコードです。のNumber.h

#ifndef NUMBER_H
#define NUMBER_H

#include <iostream>
using std::istream;
using std::ostream;

template <class T> class Number;

template <class T>
ostream& operator<<(ostream&, const Number<T>&);

template <class T>
istream& operator>>(istream&, Number<T>&);

template <class T>
class Number{
public:
    Number(const T &n)  :i(n) {}
    Number()            :i(0) {}
    T& operator+(const Number&rhs) const;
    T& operator-(const Number&rhs) const;
    T& operator*(const Number&rhs) const;
    T& operator/(const Number&rhs) const;
    friend ostream& operator<< <T> (ostream& , const Number<T>&);
    friend istream& operator>> <T> (istream& , Number<T>&);
private:
    T i;
};

#endif

そして、Number.cpp

#include "Number.h"

template<class T> 
T& Number<T>::operator+(const Number&rhs) const
{
    return i+rhs.i;
}

template<class T> 
T& Number<T>::operator-(const Number&rhs) const
{
    return i-rhs.i;
}

template<class T> 
T& Number<T>::operator*(const Number&rhs) const
{
    return i*rhs.i;
}

template<class T>
T& Number<T>::operator/(const Number&rhs) const
{
    return i/rhs.i;
}

template<class T>
ostream& operator<<(ostream&os , const Number<T>&rhs)
{
    return os<< rhs.i;
}

template<class T>
istream& operator>>(istream&is , Number<T>&rhs)
{
    return is >> rhs.i;
}

ある理由がわかりません

undefined reference to `std::istream& operator>><double>(std::istream&,Number<double>&)'
undefined reference to `Number<double>::operator+(Number<double> const&) const'

エラーなど

4

2 に答える 2

2

テンプレートに .hpp を使用すると、一時オブジェクトで参照を返すことができません。

number.h

#ifndef NUMBER_H
#define NUMBER_H

#include <iostream>
using std::istream;
using std::ostream;

template <class T> class Number;

template <class T>
ostream& operator<<(ostream&, const Number<T>&);

template <class T>
istream& operator>>(istream&, Number<T>&);

template <class T>
class Number{
        public:
                Number(const T &n)  :i(n) {}
                Number()            :i(0) {}
                T operator+(const Number&rhs) const; // Error Here return T not T&
                T operator-(const Number&rhs) const;
                T operator*(const Number&rhs) const;
                T operator/(const Number&rhs) const;
                friend ostream& operator<< <T> (ostream& , const Number<T>&);
                friend istream& operator>> <T> (istream& , Number<T>&);
        private:
                T i;
};

#include <number.hpp>

#endif

number.hpp

#ifndef NUMBER_HPP
#define NUMBER_HPP

template<class T> 
T
Number<T>::operator+(const Number& rhs) const
{
        return i + rhs.i;
}

template<class T> 
T
Number<T>::operator-(const Number&rhs) const
{
        return i-rhs.i;
}

template<class T> 
T
Number<T>::operator*(const Number&rhs) const
{
        return i*rhs.i;
}

template<class T>
T
Number<T>::operator/(const Number&rhs) const
{
        return i/rhs.i;
}

template<class T>
ostream& operator<<(ostream&os , const Number<T>&rhs)
{
        return os<< rhs.i;
}

template<class T>
istream& operator>>(istream&is , Number<T>&rhs)
{
            return is >> rhs.i;
}

#endif

main.cpp

    #include <iostream>
    #include <number.h>

    int
    main(int, const char**)
    {
        Number<double>  value(1);
        Number<double>  add(3);

        std::cout << value + add << std::endl;
        std::cout << value * add << std::endl;
        std::cout << value - add << std::endl;
        std::cout << value / add << std::endl;
        return 0;
}
于 2012-12-26T15:05:55.140 に答える
0

これらすべてのメンバー関数の定義は、テンプレートをインスタンス化するすべての翻訳単位で利用できる必要があります。Number.hを含み、使用しようとするファイルを想像してくださいNumber<int>。次に、コンパイラはasでNumberインスタンス化するためのすべてのコードを生成する必要があります。それが見られているだけなら、どうやってそれを行うことができますか? メンバー関数の定義がわかりません。TintNumber.h

修正は、メンバー関数の定義 (からのすべてNumber.cpp)を に入れることNumber.hです。あるいは、 inの代わりにNumber.cppas andという名前を付けたい人もいます、基本的にインクルードを逆にして、ヘッダーに常に実装が含まれるようにします。Number.tpp#include "Number.h"Number.cpp#include "Number.tpp"Number.h

于 2012-12-26T12:20:13.057 に答える