使用C++ 20
模块,我有以下代码片段:
export {
template<class T>
class Suite {
private:
std::vector<ConcreteBuilder<T>> things {};
};
template <class T>
class ConcreteBuilder : Builder<T> {
private:
// A collection of things of function pointers or functors
std::vector<std::function<void()>> things;
public:
// Virtual destructor
virtual ~TestBuilder() override {};
// Add a new thing to the collection of things
template<typename Function>
void add(Function&& fn) {
tests.push_back(std::forward<Function>(fn));
}
// override the build() base method from Builder<T>
virtual T build() const override {
return this->things;
}
};
}
我得到这个Clang
错误:
error: use of undeclared identifier 'ConcreteBuilder'
std::vector<ConcreteBuilder> things {};
为什么我不能访问同一模块中同一级别的类型?
编译器从上到下编译文件,而不是一次编译所有文件。它在到达class ConcreteBuilder
的定义之前到达std::vector<ConcreteBuilder<T>>
的定义。
因此,您需要将Suite
的定义移动到ConcreteBuilder
的定义之后,以便编译器在vector定义中使用它时知道它是什么。