2012-07-10 76 views
4

我不知道理解爲什麼下面的代碼不編譯克+ +:C++的typedef不是一個類,結構或聯合類型

t.cpp: In instantiation of ‘Distrib<double>’: 
t.cpp:28:56: instantiated from ‘Sampler<Distrib<Solution<double> > >’ 
t.cpp:35:48: instantiated from here 
t.cpp:16:45: erreur: ‘double’ is not a class, struct, or union type 
t.cpp:18:43: erreur: ‘double’ is not a class, struct, or union type 

我期待能夠傳播在AtomType型跨越嵌套模板...

#include <iostream> 
#include <vector> 

template<typename T> 
class Solution 
{ 
    public: 
     typedef T AtomType; 
}; 

template<typename SOLT> 
class Distrib 
{ 
    public: 
     typedef typename SOLT::AtomType AtomType; 
     typedef std::vector<AtomType> Matrix; 

     Matrix matrix; 
}; 

template<typename DT> 
class Sampler 
{ 
    public: 
     typedef typename DT::AtomType AtomType; 
     typedef typename Distrib<AtomType>::Matrix Matrix; 

     Matrix matrix; 
}; 

int main() 
{ 
    Sampler< Distrib< Solution<double> > > sampler; 
} 

回答

2

在你Sampler類,你必須:

typedef typename Distrib<AtomType>::Matrix Matrix; 

這裏,AtomTypedouble,所以這是

typedef typename Distrib<double>::Matrix Matrix; 

,然後在Distrib類,行

typedef typename SOLT::AtomType AtomType; 

擴展爲

typedef typename double::AtomType AtomType; 

因此出現錯誤信息。我想你想的Sampler班線爲:

typedef typename DT::Matrix Matrix; 
4

在你Distrib模板中,您有以下typedef

typedef typename SOLT::AtomType AtomType; 

這意味着您作爲模板參數傳入的任何類型必須具有AtomType作爲成員,並且double沒有此類事物。

如果你做出像這樣

class Double 
{ 
    typedef myType AtomType; 
}; 

一類,並通過在作爲模板參數您Distrib模板,它會編譯,如Double::AtomType確實存在。

+0

注意,OP是通過'解決'作爲參數傳遞給'Distrib'但錯誤是一樣的,如果一個'雙'本身就通過了。 – jrok 2012-07-10 10:09:09

+0

這仍然不會編譯,即使它確實會是錯誤的。問題是使用'AtomType'作爲'Distrib'的模板參數,它需要某種'Solution'。 – 2012-07-10 10:26:40

1

Matrix的typedef在Distrib類使用AtomType,但我們所期望的是一個DT

typedef typename Distrib<DT>::Matrix Matrix; 

編譯器所看到對面嵌套模板傳播的double

+0

我想你並不需要'AtomType'的typedef能夠在'Sampler'中聲明一個矩陣。你可以簡單地說'typedef typename DT :: Matrix matrix;',no? – jrok 2012-07-10 10:26:23

+0

不,「Distrib」期望一個「解決方案」,而不是另一個「Distrib」。我們沒有一個,但是因爲'DT'是'Distrib',我們不需要它 - 它應該是'typedef typename DT :: Matrix matrix;' – 2012-07-10 10:35:51

1

Distrib模板化了的Solution類型;但在Sampler::Matrix的定義中,您使用的是AtomType作爲模板參數。據推測,你只是想這是作爲對Sampler提供Distrib類型:

template<typename DT> 
class Sampler 
{ 
    // ... 
    typedef typename DT::Matrix Matrix; 
}; 
相關問題