2011-05-08 125 views
0

我嘗試運行與DEVC++模板類版本4.9.9.2 但它沒有工作 因爲:不能編譯模板類

編譯日誌:

//------------------------------- 
Compiler: Default compiler 
Building Makefile: "H:\BaiTap\Ky6\OPP\Test\Bai3.1_DEVC\Makefile.win" 
Finding dependencies for file: H:\BaiTap\Ky6\OPP\Test\Bai3.1_DEVC\main.cpp 
Finding dependencies for file: H:\BaiTap\Ky6\OPP\Test\Bai3.1_DEVC\Vecto.cpp 
Executing make... 
make.exe -f "H:\BaiTap\Ky6\OPP\Test\Bai3.1_DEVC\Makefile.win" all 
g++.exe -c main.cpp -o main.o -I"F:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"F:/Dev-Cpp/include/c++/3.4.2/backward" -I"F:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"F:/Dev-Cpp/include/c++/3.4.2" -I"F:/Dev-Cpp/include" 

**F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h: In instantiation of `std::iterator_traits<float>': 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:96: instantiated from `std::reverse_iterator<float>' 
Vecto.h:22: instantiated from `Vecto<float>' 
main.cpp:9: instantiated from here 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h:129: error: `float' is not a class, struct, or union type 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h:130: error: `float' is not a** class, struct, or union type 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h:131: error: `float' is not a class, struct, or union type 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h:132: error: `float' is not a class, struct, or union type 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator_base_types.h:133: error: `float' is not a class, struct, or union type 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h: In instantiation of `std::reverse_iterator<float>': 
Vecto.h:22: instantiated from `Vecto<float>' 
main.cpp:9: instantiated from here 

**F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:96: error: no type named `iterator_category' in `struct std::iterator_traits<float>'** 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:103: error: no type named `difference_type' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:104: error: no type named `reference' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:105: error: no type named `pointer' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:150: error: no type named `reference' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:162: error: no type named `pointer' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:220: error: no type named `difference_type' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:229: error: no type named `difference_type' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:241: error: no type named `difference_type' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:250: error: no type named `difference_type' in `struct std::iterator_traits<float>' 
F:/Dev-Cpp/include/c++/3.4.2/bits/stl_iterator.h:262: error: no type named `reference' in `struct std::iterator_traits<float>' 
Vecto.h: In instantiation of `Vecto<float>': 
main.cpp:9: instantiated from here 
Vecto.h:22: error: template-id `operator+<float>' for `Vecto<float> operator+(const Vecto<float>&, const Vecto<float>&)' does not match any template declaration 
Vecto.h:24: error: template-id `operator-<float>' for `Vecto<float> operator-(const Vecto<float>&, const Vecto<float>&)' does not match any template declaration 
Vecto.h:33: error: template-id `operator<< <float>' for `std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, const Vecto<float>&)' does not match any template declaration 
Vecto.h:35: error: templ 
........................ 
make.exe: *** [main.o] Error 1 
Execution terminated 
//--------------------------------- 

,這裏是我的代碼

//----------------------------------- 
#ifndef VECTO_H_ 
#define VECTO_H_ 

#include <iostream> 

using namespace std; 

template < class T > 
class Vecto { 
private: 
    int n; 

    T *data; 
public: 
    // constructor 
    Vecto(int = 0); 
    // copy constuctor 
    Vecto(const Vecto&); 
    // destructor 
    ~Vecto(); 

    friend Vecto operator+ <T> (const Vecto &lvt, const Vecto &rvt); 

    friend Vecto operator- <T> (const Vecto &lvt, const Vecto &rvt); 

    template < class U > 
    friend U operator* (const Vecto <U> &lvt, const Vecto <U> &rvt); 

    const Vecto &operator= (const Vecto &); 

    T &operator[] (int) const; 

    friend ostream &operator << <T> (ostream &,const Vecto &); 

    friend istream &operator >> <T> (istream &,Vecto &); 

}; 
#endif 


//----------------------------- 


//file Vecto.cpp 

#include "Vecto.h" 

using namespace std; 

template < class T > 
Vecto <T> ::Vecto(int n){ 
    this- > n = n; 
    data = new T[n]; 
} 

template < class T > 
Vecto <T> ::Vecto(const Vecto <T> &vt){ 
    n = vt.n; 
    delete [] data; 
    data = new T[n]; 
    for(int i=n-1; i > =0; i--) 
     data[i] = vt.data[i]; 
} 

template < class T > 
Vecto <T> ::~Vecto(){ 
    if(data != NULL) 
     delete[] data; 
} 

template < class T > 
Vecto <T> operator+ (const Vecto <T> &lvt, const Vecto <T> &rvt){ 
    Vecto <T> *p = NULL; 
    if(lvt.n == rvt.n){ 
     p = new Vecto <T> (lvt.n); 
     for(int i=0; i < lvt.n ; i++) 
      p- > data[i] = lvt.data[i] + rvt.data[i]; 
    } 
    return *p; 
} 
template < class T > 
Vecto <T> operator- (const Vecto <T> &lvt, const Vecto <T> &rvt){ 
    Vecto <T> *p = NULL; 
    if(lvt.n == rvt.n){ 
     p = new Vecto <T> (lvt.n); 
     for(int i=0; i < lvt.n ; i++) 
      p- > data[i] = lvt.data[i] - rvt.data[i]; 
    } 
    return *p; 
} 
template < class T > 
T operator* (const Vecto <T> &lvt, const Vecto <T> &rvt){ 
    T result =0; 
    if(lvt.n == rvt.n){ 
     for(int i = lvt.n -1; i > =0; i--) 
      result += (lvt.data[i]*rvt.data[i]); 
    } 
    return result; 
} 

template < class T > 
const Vecto <T> &Vecto <T> ::operator= (const Vecto <T> &vt){ 
    delete []data; 
    n = vt.n; 
    data = new T[n]; 
    for(int i=0; i < n;i++) 
     data[i] = vt.data[i]; 
    return (*this); 
} 

template < class T > 
T &Vecto <T> ::operator[] (int i) const{ 
    T null = 0; 
    if(i < 0||i > =n) return null; 
    else return data[i]; 
} 
template < class T > 
ostream &operator < < (ostream &out, const Vecto <T> &vt){ 
    out < < "Dims of Vecto: " < < vt.n < < endl; 
    out < < "Data:" < < endl; 
    for(int i = 0; i < vt.n; i++) 
     out < < vt.data[i] < < " "; 
    out < < endl; 
    return out; 
} 
template < class T > 
istream &operator > > (istream &in, Vecto <T> &vt){ 
    for(int i = 0; i < vt.n; i++){ 
     cout < < "Vecto[" < < i < < "]="; 
     in > > vt.data[i]; 
    } 
    return in; 
} 
//---------------------------------------------------------- 
//file main.cpp 
#include <cstdlib> 
#include <iostream> 
#include "Vecto.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    Vecto <float> vt1(2); 
    cin > > vt1; 
    Vecto <float> vt2 = vt1;// - vt1; 
    vt2[0] = 100; 
    cout < < vt2; 
    cout < < vt2*vt1 < < endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
//-------------------------------- 

,你可以在這裏下載代碼。

http://www.mediafire.com/?3hknr5kj33mh4h8 任何一個能幫助我嗎? 感謝閱讀這篇文章。

+7

即非常多的(格式錯誤的)代碼。請將其降至最低限度以重現您的問題。 – Johnsyweb 2011-05-08 10:03:12

+0

請修復您的格式。預覽窗格位於添加/編輯框正下方,並且位於右側。 – 2011-05-08 10:13:22

+1

Dev-C++很簡單,老舊。我強烈建議你避免它。 Code :: Blocks是一個很好的選擇。 – 2011-05-08 11:03:54

回答

2

你應該在格式化你的代碼更加小心。這樣

cout < < "Hello" < < endl; 

東西根本不起作用 - 如何將編譯器知道你要調用operator<<而不是operator<一個濫用的形式?

此外,這

friend Vecto operator+<T> (const Vecto &lvt, const Vecto &rvt); 

沒有任何意義。我想你想這樣:

friend Vecto<T> operator+(const Vecto<T> &lvt, const Vecto<T> &rvt); 

而且,你爲什麼叫你的班級Vecto?你寧可稱它爲Vector或甚至更好地使用std::vector

1

模板必須在所有的翻譯單位,他們將被使用來定義。這實際上意味着您必須在標題中定義整個類。