2017-04-05 37 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.