2017-04-05 43 views
0

我努力理解如何編譯:這個模板代碼是如何編譯的?

template <class T, class U> 
struct A { ... }; 

struct B { 
    template <class T> 
    using C = A<T, B>; 
    ... 
}; 

如何傳遞「B」作爲一個模板參數「A」「B」的定義範圍內 - 也就是,「B」是不是尚未完全確定......

任何幫助將不勝感激,

乾杯

+3

它明確地被C++允許。 B不需要完全定義,除非它在'A'中用作值類型。 – Justin

+1

不要發佈不會編譯的代碼,然後告訴我們編譯它。在這些情況下,請提供[MCVE](http://stackoverflow.com/help/mcve)。 – paddy

+0

用'/ * ... * /'替換橢圓,並且你有一個MCVE或者一些簡單的關閉。 – Davislor

回答

3

在你關心的路線,B被聲明爲這裏有一個簡單的例子「不完整的類型。」:

struct foo { 
    foo *p; 
}; 

您還可以用類似struct foo;的語句聲明不完整的類型。這並沒有給編譯器足夠的信息來讓你創建foo或在另一個結構中存儲foo,但它確實讓你在知道foo是一個類型的名稱就足夠的上下文中使用該名稱。舉個例子:

#include <vector> 

struct foo; 
using foovector = std::vector<foo>; // Legal. 
// foovector v(4); // Invalid. 

如果取消註釋最後一行,並嘗試編譯,你會得到一堆錯誤信息說foo是一個不完整的類型。編譯器不能創建vectorfoo,因爲它不知道foo的大小,或者因此分配多少內存。但給這個類型一個完整的定義,它的工作原理如下:

#include <vector> 

struct foo; 
using foovector = std::vector<foo>; // Legal. 

struct foo { 
    foo *p; 
}; 

foovector v(4); // Now this works.