2010-08-05 119 views
2

考慮以下代碼:typedef和模板專業化

typedef int type1; 
typedef int type2; 

template <typename> 
struct some_trait; 

template <> 
struct some_trait<type1> 
{ 
    static const int something=1; 
}; 

template <> 
struct some_trait<type2> 
{ 
    static const int something=2; 
}; 

因爲什麼編譯器看到的是some_trait<int>兩個專業它將失敗。

最好的解決方法是什麼?

+3

你怎麼能指望一個答案*什麼是解決這個問題的最好辦法*當你?沒有定義你的問題?這是一個常見的錯誤:詢問失敗的方法,而不是詢問實際問題。你想要解決什麼問題?是什麼讓你想要在'type1'和'type2'中添加特質?爲什麼你需要兩個'int'來區別? - 尋求答案的最大步驟是提出正確的問題。 – 2010-08-05 17:04:39

回答

3

最好的方法是什麼?

這兩種類型名稱都指代相同的int類型。由於這裏只有一個類型,您只需要一個特質。所以,「解決這個問題的最好辦法」是去除第二種專業化,忘掉它。完成。

這就是你想要的嗎?如果沒有,請提供一個更有意義的描述,說明你正在努力實現的目標。

+3

我相信他想要專注於type1和type2,這是他的棄權是不相關的類型,但編譯器被掛在無關緊要的實現細節上,他們都只是整數。 – 2010-08-05 17:00:56

6

我認爲能夠專注上的名字type1type2你就必須讓他們實際上是不同類型的,而不是對同一類型的別名:

struct type1 { 
    int data; 
}; 

struct type2 { 
    int data; 
}; 

// ... 

但是,如果你解釋一下您的最終目標可能會有不同/更好的方式來完成您要找的內容。

0

我沒有看到你要在這裏做什麼。最終,兩者都是some_trait< int >
試圖圍繞單個int做結構?

2

,你可以有這樣的事情,如果你的意思是明確的專業化

enum TypeOne; 
enum TypeTwo; 

template <typename> 
class AClass; 

template <> 
class AClass<TypeOne>{ 
public: 
    int something; 
}; 

template <> 
class AClass<TypeTwo>{ 
public: 
    char something; 
}; 

AClass<TypeOne> obj1; 
AClass<TypeTwo> obj2; 

我從Boost庫也看到的東西,可以做你想做的,typedef的同一類的不同類型明確專業化,但我不記得究竟是什麼。

2

聽起來像下面可能是你追求的:

template <int arg> 
class AClass 
{ 
    static const int something=arg; 
}; 

這將被實例化,如:

AClass<1> obj1; 
AClass<2> obj2; 
2

該代碼失敗,因爲編譯器看到相同發生專業化兩次

您的問題是typedef,儘管它的名字,確實定義一個新的類型。它只生成另一種類型的別名type1type2int實際上只是同一類型的不同名稱。

這個最好的方法是什麼取決於你想達到什麼。如果你絕對需要這種專業化,你將不得不提出兩種不同的類型。但是,可能有更好的方法來做到這一點。

0

我想你想達到這樣的事:template <typename T, T t> struct typify{ static const T something = t;};然後你2個專業化將被寫爲struct int_1 : typify<int, 1>{};和...