Alex Vergara
Alex Vergara

Reputation: 2229

undeclared indentifier on the same scope C++

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?

Upvotes: 0

Views: 137

Answers (1)

Ifier
Ifier

Reputation: 523

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.

Upvotes: 3

Related Questions