2016-03-09 30 views
-1

我分析了一段代碼,我碰到這個讓您的教學班,花車以及與整數(分析一段代碼)工作

class X 
{ 
//content 
}; 

typedef X<float> X; 

傳來有人能指出我的東西更接近這是什麼(使用 <type>基本上使第二類與第二類工作)被稱爲,它是如何工作,或在什麼情況下,我們使用這個,所以我可以繼續搜索。 (在我的情況下,它被用作定義一個3維向量的一類。)

這是整個代碼:

template<typename T> 
class Vec3 
{ 
public: 
    T x, y, z; 
    Vec3() : x(T(0)), y(T(0)), z(T(0)) {} 
    Vec3(T xx) : x(xx), y(xx), z(xx) {} 
    Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {} 
    Vec3& normalize() 
    { 
     T nor2 = length2(); 
     if (nor2 > 0) { 
      T invNor = 1/sqrt(nor2); 
      x *= invNor, y *= invNor, z *= invNor; 
     } 
     return *this; 
    } 
    Vec3<T> operator * (const T &f) const { return Vec3<T>(x * f, y * f, z * f); } 
    Vec3<T> operator * (const Vec3<T> &v) const { return Vec3<T>(x * v.x, y * v.y, z * v.z); } 
    T dot(const Vec3<T> &v) const { return x * v.x + y * v.y + z * v.z; } 
    Vec3<T> operator - (const Vec3<T> &v) const { return Vec3<T>(x - v.x, y - v.y, z - v.z); } 
    Vec3<T> operator + (const Vec3<T> &v) const { return Vec3<T>(x + v.x, y + v.y, z + v.z); } 
    Vec3<T>& operator += (const Vec3<T> &v) { x += v.x, y += v.y, z += v.z; return *this; } 
    Vec3<T>& operator *= (const Vec3<T> &v) { x *= v.x, y *= v.y, z *= v.z; return *this; } 
    Vec3<T> operator -() const { return Vec3<T>(-x, -y, -z); } 
    T length2() const { return x * x + y * y + z * z; } 
    T length() const { return sqrt(length2()); } 
    friend std::ostream & operator << (std::ostream &os, const Vec3<T> &v) 
    { 
     os << "[" << v.x << " " << v.y << " " << v.z << "]"; 
     return os; 
    } 
}; 

typedef Vec3<float> Vec3f; 
+2

提供你在想*模板*? –

+1

這不會編譯。這兩者都是因爲'X'不是一個模板,並且由於'X'的衝突聲明。 – interjay

回答

3

你可能已經錯過了一些相關物件的class X出庭代碼:

template <typename T> // <<<<<<<<<<<<<<<<<<<<<< 
class X 
{ 
//content 
}; 

可有人點我的東西更接近的是什麼叫源,

這就是所謂的班級模板

它是如何工作

在類模板定義中的代碼將被實例化的各類由

typedef X<float> X; 

typedef X<int> Y; 
+0

什麼錯誤是類模板的<>部分...如何編寫類的int,例如3d矢量類,當您寫入時自動爲float設置 typedef X 對於問題I的格式'非常非常新的stackoverflow :( – maltkat