Home > database >  undeclared indentifier on the same scope C
undeclared indentifier on the same scope C

Time:06-09

Playing with C 20 modules, I have the following snippet:

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;
            }
    };
}

And I am getting this Clang error:

error: use of undeclared identifier 'ConcreteBuilder'
std::vector<ConcreteBuilder> things {};

Why I can't access to a type that are in the same module at the same level?

CodePudding user response:

The compiler compiles the file from the top down, not all at once. It is hitting the definition of std::vector<ConcreteBuilder<T>> before it gets to the definition of class ConcreteBuilder.

So, you need to move your definition of Suite after the definition of ConcreteBuilder, so the compiler knows what it is when you use it in the vector definition.

  • Related