Ошибка С2065: необъявленный идентификатор

119
24 июня 2019, 10:50

Столкнулся с проблемой, но на существующих топиках об этой проблеме не нашел решения. Я в затруднении, все include'ы правильно расставлены вроде, да и средствами visual studio у меня получается перейти к объявлению функции, а ошибка все равно вылетает: "С2065. resizeCallback: необъявленный идентификатор". Вот код:

#pragma once
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#define internal static
#define local_persist static
#define global_variable static

namespace core {
namespace graphics {
    class Window
    {
        private:
            const char* name;
            int width, height;
            GLFWwindow* window;
        public:
            Window(const char* name, int width, int heignt);
            ~Window();
            bool closed();
            void MainLoop();
        private:
            bool init();
            void clear();
            void update();
            void render();
            friend void resizeCallback(GLFWwindow* window, int width, int height);
    };
}}

Вот второй файл

#include "window.h"
namespace core {
namespace graphics {
    Window::Window(const char* name, int width, int height)
    {
        this->name = name;
        this->width = width;
        this->height = height;
        if (!init())
        {
            glfwTerminate();
        }
    }
    Window::~Window()
    {
        glfwTerminate();
    }
    bool Window::init()
    {
        if (!glfwInit())
        {
            std::cout << "LooL. GLFW isn't ok" << std::endl;
            glfwTerminate();
            return false;
        }
        window = glfwCreateWindow(width, height, name, NULL, NULL);
        glfwMakeContextCurrent(window);
        glfwSetWindowSizeCallback(window, resizeCallback);
        if (glewInit() != GLEW_OK)
        {
            std::cout << "glew isn't okay" << std::endl;                
            return false;
        }
        return true;
    }
    void Window::update()
    {
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
    void Window::clear()
    {
        glClear(GL_COLOR_BUFFER_BIT);
    }

    void Window::render()
    {
        glBegin(GL_QUADS);
        glVertex2f(0.5f, 0.5f);
        glVertex2f(0.5f, -0.5f);
        glVertex2f(-0.5f, -0.5f);
        glVertex2f(-0.5f, 0.5f);
        glEnd();
    }
    void Window::MainLoop()
    {
        update();
        clear();
        render();
    }
    bool Window::closed()
    {
        return (glfwWindowShouldClose(window)) == 1;
    }
    void resizeCallback(GLFWwindow* window, int width, int height)
    {
        glViewport(0, 0, width, height);
    }
}}
Answer 1

Объявление функции как friend внутри класса ссылается на функцию из охватывающего namespace (namespace graphics в вашем случае), но не создает видимого объявления этой функции в охватывающем namespace. Поэтому ваша resizeCallback - невидима до тех пор, пока вы ее явно не переобъявите на уровне namespace.

На уровне namespace ваша resizeCallback объявлена в самом низу файла. Это значит, что выше по файлу resizeCallback является "необъявленным идентификатором".

(Увидеть такую "невидимую" функцию может только Argument Dependent Lookup, но к вашему случаю это не относится.)

Либо перенесите определение resizeCallback в самое начало namespace graphics. Либо (лучше) добавьте ее явное объявление прямо в хедере, рядом с определением класса.

READ ALSO
сортировка std::set c++

сортировка std::set c++

у меня есть std::set с кастомным компаратором, в set я кладу свой тип данных, который содержит два параметра, уникальность должна обеспечиваться...

160
Элемент Point (org.springframework.data.geo.Point) сохраняется в Postgresql как Bytea. Почему и как мне сохранить координаты точки?

Элемент Point (org.springframework.data.geo.Point) сохраняется в Postgresql как Bytea. Почему и как мне сохранить координаты точки?

Начал изучать Java и Spring frameworkДелаю задание, часть которого - хранение набора точек с привязкой к какой-то площади (не важно к какой, к вопросу...

210
SQL запросы в Hibernate

SQL запросы в Hibernate

Могу ли я в контексте Spring + Hibernate сделать простой sql запрос и получить список элементов ( как в JDBC - ResultSet) для запроса данных из таблицы, не входящей...

217