PString - Clock.h:239: error: 'PString' does not name a type

Why am I getting this infuriating compile error?

The PString library is clearly included at the top of my header file.

#ifndef CLOCK_H
#define CLOCK_H

#include <Arduino.h>
#include <IRremote.h>
#include <RealTimeClockDS1307.h>
#include <PString.h>
#include <Wire.h>
#include <EEPROMex.h>
#include "LED.h"
#include "DisplayElem.h"




//const uint8_t PROGMEM NUM_LEDS 26
const uint8_t PROGMEM NUM_LEDS = 31;

const uint8_t PROGMEM NUM_KEY_CODES = 7;
const uint8_t PROGMEM UP_ARROW = 0;
const uint8_t PROGMEM DOWN_ARROW = 1;
const uint8_t PROGMEM LEFT_ARROW = 2;
const uint8_t PROGMEM RIGHT_ARROW = 3;
const uint8_t PROGMEM ENTER = 4;
const uint8_t PROGMEM EXIT = 5;
const uint8_t PROGMEM HOME = 6;




const uint8_t PROGMEM NUM_FIELDS = 7;
const uint8_t PROGMEM WEEK_DAY = 0;
const uint8_t PROGMEM MONTH_DAY = 1;
const uint8_t PROGMEM MONTH = 2;
const uint8_t PROGMEM YEAR = 3;
const uint8_t PROGMEM HOUR = 4;
const uint8_t PROGMEM MINUTE = 5;
const uint8_t PROGMEM SECOND = 6;

const uint8_t PROGMEM DISPLAY_TIME = 0;
const uint8_t PROGMEM DISPLAY_DATE = 1;
const uint8_t PROGMEM DISPLAY_PROMPT = 2;
const uint8_t PROGMEM SETUP_REMOTE = 3;



typedef struct
{
    unsigned long m_nKeyCode;
    const __FlashStringHelper* PROGMEM m_strPrompt;
} 
RemoteControl;

typedef struct
{
    uint8_t m_nFieldVal;
    const __FlashStringHelper* PROGMEM m_strPrompt;
}
ClockFields;




class CClock
{
    public:
    
        // Construction & destruction
        CClock();
    
        ~CClock();
        
        void setDateTime(uint8_t nDOW, uint8_t nDOM, uint8_t nMon, uint8_t nYear, uint8_t nHr, uint8_t nMin, uint8_t nSec);
        
        void setPinNums(const int8_t nLedNum, const int8_t nXPinNum, const int8_t nYPinNum);
            
        const int8_t getXPinNum(const int8_t nLedNum);
        const int8_t getYPinNum(const int8_t nLedNum);
        
        void doDisplay(const unsigned long nCount); 
        
        void showSecondHand();
        
        void doSetRemoteKeyCode(IRrecv &irrecv, decode_results &results);
  
        inline bool isRightOrLeftArrow(unsigned long nCode)
        {
            return (nCode == m_arrayRemoteControl[LEFT_ARROW].m_nKeyCode) || (nCode == m_arrayRemoteControl[RIGHT_ARROW].m_nKeyCode);
        };
        inline bool isUpOrDownArrow(unsigned long nCode)
        {
            return (nCode == m_arrayRemoteControl[UP_ARROW].m_nKeyCode) || (nCode == m_arrayRemoteControl[DOWN_ARROW].m_nKeyCode);
        };
        inline bool isEnter(unsigned long nCode)
        {
            return nCode == m_arrayRemoteControl[ENTER].m_nKeyCode;
        };
        inline bool isExit(unsigned long nCode)
        {
            return nCode == m_arrayRemoteControl[EXIT].m_nKeyCode;
        };
        byte getIncDecVal(unsigned long nCode);
        uint8_t getNextField(unsigned long nCode, uint8_t nFieldNum, uint8_t &nMin, uint8_t &nMax);
        void doChangeTimeDate(IRrecv &irrecv, decode_results &results);
        
        void init();
        
        void line(const int8_t nStart, const int8_t nLength);
        
        inline void doSetupRemote()
        {
            m_nMode = SETUP_REMOTE;
        };
  
        inline bool isUnkownCode(const long unsigned nCode)
        {
            return (nCode != m_arrayRemoteControl[ENTER].m_nKeyCode) && (nCode != m_arrayRemoteControl[EXIT].m_nKeyCode) && 
					(nCode != m_arrayRemoteControl[HOME].m_nKeyCode) && (nCode != m_arrayRemoteControl[LEFT_ARROW].m_nKeyCode) && 
					(nCode != m_arrayRemoteControl[RIGHT_ARROW].m_nKeyCode) && (nCode != m_arrayRemoteControl[UP_ARROW].m_nKeyCode) && 
					(nCode != m_arrayRemoteControl[DOWN_ARROW].m_nKeyCode);
        };

        inline bool isEnterCode(const long unsigned nCode)
        {
            return nCode == m_arrayRemoteControl[ENTER].m_nKeyCode;
        };
        
        inline bool isExitCode(const long unsigned nCode)
        {
            return nCode == m_arrayRemoteControl[EXIT].m_nKeyCode;
        };
        
        inline bool isELeftArrowCode(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[LEFT_ARROW].m_nKeyCode);
        };

        inline bool isRightArrowCode(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[RIGHT_ARROW].m_nKeyCode);
        };

        inline bool isUpArrowCode(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[UP_ARROW].m_nKeyCode);
        };

        inline bool isDownArrowCode(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[DOWN_ARROW].m_nKeyCode);
        };
       
        inline bool isHomeCode(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[HOME].m_nKeyCode);
        };

        inline bool isInSetupRemoteMode()
        {
            return m_nMode == SETUP_REMOTE;
        };

        const char* getFormattedDate();
        const char* getFormattedDateTime();

    protected:
      
        // utility functions
        inline void point(const int8_t nStart) 
        {
            if ((nStart >= 0) && (nStart < NUM_LEDS))
            {
                m_arrayLEDs[nStart].on();
            }
        };
        void off(); 
        float floatModulus(const float fNum, const float fDenom);
        
        // Display clock parts
        void doDisplayCentre();
        void doDisplayRim(const float fAngleMin, const float fAngleRot);
        void doDisplaySecondHand(const float fAngleSec, const float fAngleRot);
        void doDisplayMinuteHand(const float fAngleMin, const float fAngleRot);
        void doDisplayHourHand(const float fAngleHour, const float fAngleRot);
        void doDisplayDivision(const float fAngleRot);
        
        // Date & time entry related functions
        void advanceTimeDateMode(const unsigned long nCode);
        void doIncOrDec(uint8_t nFieldNum, const uint8_t nMin, const uint8_t nMax, const int8_t nIncDec);
        inline bool isUpArrow(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[UP_ARROW].m_nKeyCode);
        };
        inline bool isDownArrow(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[DOWN_ARROW].m_nKeyCode);
        };
        inline bool isNext(const long unsigned nKeyCode)
        {
            return (nKeyCode == m_arrayRemoteControl[RIGHT_ARROW].m_nKeyCode) || (nKeyCode == m_arrayRemoteControl[LEFT_ARROW].m_nKeyCode);
        };
        void doSaveTimeDate();
        void doReadTimeDate();
        int8_t getMaxDay(const int8_t nMon, const int8_t nYear);
        bool isValidTimeDate();
        
        // Remote control key related functions.
        void xferKeyCodes(const bool bRead = true);
                                
        
        // Which key code are we waiting for

        // Display modes
        inline bool isDisplayDateMode()
        {
            return m_nMode == DISPLAY_DATE;
        };
        
        inline bool isDisplayTimeMode()
        {
            return m_nMode == DISPLAY_TIME;
        };
        
        inline bool isLeapYear(const int8_t nYear)
        {
            return (((nYear % 4) == 0) && ((nYear % 100) != 0)) || ((nYear % 400) == 0);
        };
        
        // Data
        bool m_bShowSecondHand;
        
        CLED m_arrayLEDs[NUM_LEDS];
        uint8_t m_nMode; 
        CText m_text;
        RemoteControl m_arrayRemoteControl[NUM_KEY_CODES];
        ClockFields m_arrayClockFields[NUM_FIELDS];
        EEPROMClassEx m_EEPROM;
        RealTimeClockDS1307 m_RTC;
        static PString m_pstrBuff;
};

People that don't have their heads shoved too far up their asses name the file containing a class with the same name as the class. The Arduino team does not always fit that mold.

Those same people actually post the error messages.