Вводящее в заблуждение сообщение об ошибке компилятора: size_t не является членом std?

У меня есть следующий заголовочный файл, содержащий класс шаблона:

#ifndef VECTOR_H
#define VECTOR_H

namespace lgl
{
    namespace maths
    {
        template<class T, std::size_t SIZE>
        class Vector
        {
        public:
            Vector();
            Vector(T defaultValue);
            Vector(const Vector<T, SIZE>& other);
            Vector<T, SIZE>& operator=(const Vector<T, SIZE>& other);
            ~Vector();

            //accessors
            const std::size_t size() const;
            const T& operator[](std::size_t i) const;
            T& operator[](std::size_t i);

            //vector operations
            Vector<T, SIZE> operator+(const Vector<T, SIZE>& other) const;
            Vector<T, SIZE> operator-(const Vector<T, SIZE>& other) const;
            Vector<T, SIZE> operator*(const T& scalar) const ;
            Vector<T, SIZE> operator/(const T& scalar) const ;
            T operator*(const Vector<T, SIZE>& other) const;

            void operator+=(const Vector<T, SIZE>& other);
            void operator-=(const Vector<T, SIZE>& other);
            void operator*=(const T& scalar);
            void operator/=(const T& scalar);

            bool operator==(const Vector<T, SIZE>& other) const;
            bool operator!=(const Vector<T, SIZE>& other) const;

        private:
            T m_elements[SIZE];

        };

        template<class T, std::size_t SIZE>
        std::ostream& operator<<(std::ostream& os, const Vector<T, SIZE>& vec);

        template<class T>
        Vector<T, 3> cross(const Vector<T, 3>& a, const Vector<T, 3>& b);

        #include "Vector.tpp"

        //typedefs
        typedef Vector<float, 2> vec2f;
        typedef Vector<float, 3> vec3f;
        typedef Vector<float, 4> vec4f;
        typedef Vector<double, 2> vec2d;
        typedef Vector<double, 3> vec3d;
        typedef Vector<double, 4> vec4d;
        typedef Vector<int, 2> vec2i;
        typedef Vector<int, 3> vec3i;
        typedef Vector<int, 4> vec4i;

        //factories
        vec2f getVec2f(float x, float y);
        vec3f getVec3f(float x, float y, float z);
        vec4f getVec4f(float x, float y, float z, float h);
    }
}

#endif

Файл .tpp содержит все реализации методов шаблонного класса Vector. У меня также есть файл Vector.cpp, который определяет фабричные функции, например:

#include "Vector.h"

namespace lgl
{
    namespace maths
    {
        //factories
        vec2f getVec2f(float x, float y)
        {
            vec2f result;
            result[0] = x;
            result[1] = y;
            return result;
        }

        vec3f getVec3f(float x, float y, float z)
        {
            vec3f result;
            result[0] = x;
            result[1] = y;
            result[2] = z;
            return result;
        }

        vec4f getVec4f(float x, float y, float z, float h)
        {
            vec4f result;
            result[0] = x;
            result[1] = y;
            result[2] = z;
            result[3] = h;
            return result;
        }
    }
}

Я получаю ошибки: size_t не является членом std, а ostream не является членом std. Если я удалю все в файле .cpp и не буду использовать фабрики, все в порядке. Так в чем может быть проблема?


person levious    schedule 03.07.2015    source источник
comment
Вы включили правильные заголовки, такие как <iostream>?   -  person Dark Falcon    schedule 03.07.2015
comment
Выложите полный код. #include здесь имеют решающее значение. Кстати, ostream находится в <ostream>, а size_t — в <cstddef>.   -  person lisyarus    schedule 03.07.2015
comment
В качестве примечания вы, вероятно, можете взглянуть на std::array в С++ 11, поскольку вы в значительной степени изобретаете его заново...   -  person Ilya Kobelevskiy    schedule 03.07.2015
comment
Я отредактировал вопрос, полный код опубликован. Это просто для практики, я студент.   -  person levious    schedule 03.07.2015
comment
Итак, я включил iostream в Vector.h, и теперь он работает. Однако, если я не включу его и удалю содержимое Vector.cpp, это сработает. Если я восстанавливаю Vector.cpp, но не включаю iostream в заголовок, я получаю ошибки. Почему это происходит?   -  person levious    schedule 03.07.2015
comment
Одна проблема заключается в том, что вы включаете Vector.hpp из пространства имен. Все определения и объявления в Vector.hpp и в файлах, включенных Vector.hpp, будут в lgl::maths. Поскольку вы не включили Vector.hpp, трудно сказать, какое влияние это окажет.   -  person Captain Obvlious    schedule 03.07.2015
comment
@IlyaKobelevskiy std::array не реализует скалярное умножение или перекрестное произведение. При этом, хотя в стандартной библиотеке нет математического векторного класса, около 2000 библиотек уже имеют реализацию такого векторного класса.   -  person KABoissonneault    schedule 03.07.2015
comment
@KABoissonneault Всегда есть std::valarray.   -  person Captain Obvlious    schedule 03.07.2015
comment
@CaptainObvlious Я думаю, независимо от того, насколько хорошо вы знаете стандартную библиотеку, всегда найдется какая-то полезная функция, о которой вы не знаете.   -  person KABoissonneault    schedule 03.07.2015


Ответы (1)


Напишите

#ifndef VECTOR_H
#define VECTOR_H

#include <iosfwd>
#include <cstddef>

namespace lgl
{
//...
person Vlad from Moscow    schedule 03.07.2015