在模板,在那里,为什么我必须把typename和template上依赖的名字呢?究竟什么是依赖名称?我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …Run Code Online (Sandbox Code Playgroud) 例如,以下代码:
#include <iostream>
#include <string>
int main()
{
print("Hello!");
}
void print(std::string s) {
std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在尝试构建时,我得到以下内容:
program.cpp: In function ‘int main()’:
program.cpp:6:16: error: ‘print’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
这是有道理的.
那么为什么我可以在一个结构中进行类似的概念,但是不能为此大吼大叫呢?
struct Snake {
...
Snake() {
...
addBlock(Block(...));
}
void addBlock(Block block) {
...
}
void update() {
...
}
} snake1;
Run Code Online (Sandbox Code Playgroud)
我不仅没有得到警告,而且程序实际编译!没有错误!这只是结构的本质吗?这里发生了什么事?显然addBlock(Block)是在声明方法之前调用的.
在阅读这个问题的一些答案时,我开始想知道为什么编译器在第一次遇到函数时确实需要知道它.在解析收集在其中声明的所有符号的编译单元时添加额外的通道是不是很简单,这样它们的声明和使用顺序就不再重要了?
有人可能会争辩说,在使用它们之前声明函数肯定是好的风格,但我想知道,为什么在C++中这是强制性的还有其他原因?
编辑 - 举例说明:假设您必须在头文件中内联定义的函数.这两个函数相互调用(可能是递归树遍历,其中树的奇数层和偶数层的处理方式不同).解决这个问题的唯一方法是在另一个函数之前声明其中一个函数.
一个更常见的例子(虽然有类,而不是函数)是带有private构造函数和工厂的类的情况.工厂需要知道类以便创建它的实例,并且类需要知道工厂的friend声明.
如果要求来自以前的日子,为什么它在某些时候没有被删除?它不会破坏现有的代码,不是吗?