2015-12-20 3 views
-1

Я пишу короткую программу, подобную тесту, как часть более крупного проекта. Я написал несколько простых функций в файле «Utilities.hpp», для которого я пишу тесты. Вот код ... некоторые определения функций были исключены по длине.Функции, не признанные как часть пространства имен

//Main.cpp 
#ifdef RUN_TESTS 

#include "Logger.hpp" 
#include "UnitTester.hpp" 


#define TEST_ALL 

int main(int, char*[]) 
{ 
    logger::init(); 
    logger::setSeverityLevel(INFO); 
    auto slg = logger::getSLogger(); 

    BOOST_LOG_SEV(slg, INFO) << "Starting Unit Tests..."; 

    testing::UnitTester testObject; 
    testObject.runTests(); 
} 

#endif 

Utilities.hpp

#pragma once 

#include <string> 
#include <stack> 
#include <vector> 


namespace util 
{ 
    void swapChars(char& a, char& b); //flips two chars 

    std::string reverseString(const std::string& str); //stack based implementation of string inversion 

    std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split); //splits string into parts seperated by "split" 
} 

Utilities.cpp

#include "Utilities.hpp" 



void util::swapChars(char& a, char& b) 
{ 

... 

} 

std::string util::reverseString(const std::string& str) 
{ 
... 
} 


std::vector<std::string> util::splitStrAtSubstr(const std::string& str, const std::string& split) 
{ 
... 
} 

Наконец класс UnitTester ... UnitTester.hpp

#pragma once 
#define RUN_TESTS 
#define RUN_ALL 
#ifdef RUN_TESTS 

#include "Logger.hpp" 
#include <string> 
#include <vector> 

namespace testing 
{ 

    class UnitTester 
    { 
    public: 
     UnitTester(); 
     ~UnitTester(); 
     void runTests(); 

    private: 
     src::severity_logger<severity_level> testLogger; 

     void utilities(); 
     void logging(); 
     void resourceGroup(); 
     void resourceManager(); 
     void INIParser(); 
    }; 

} 
#endif 

UnitTester.cpp

#include "UnitTester.hpp" 
#ifdef RUN_TESTS 


void testing::UnitTester::runTests() 
{ 
#ifdef RUN_ALL 
    utilities(); 
    logging(); 
    resourceGroup(); 
    resourceManager(); 
    INIParser(); 
#elif 
    #ifdef TEST_UTILITIES 
     utilities(); 
    #endif 
    #ifdef TEST_LOGGING 
      logging(); 
    #endif 
    #ifdef TEST_RESOURCE_GROUP 
      resourceGroup(); 
    #endif 
    #ifdef TEST_RESOURCE_MANAGER 
      resourceMananager(); 
    #endif 
    #ifdef TEST_INI_PARSER 
      INIParser(); 
    #endif 
#endif 
} 

//PRIVATE FUNCTIONS 

void testing::UnitTester::utilities() 
{ 
#include "Utilities.hpp" 

    BOOST_LOG_SEV(testLogger, INFO) << "Now testing: void util::swapChars(char& a, char& b);"; 
    char a = 'a', b = 'b'; 
    util::swapChars(a, b); 
    if (a != 'b' || b != 'a') { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::swapChars failed."; } 

    BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::string util::reverseString(const std::string& str);"; 
    if (util::reverseString("myString") != "gnirtSym") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"myString\""; } 
    if (util::reverseString("MYSTRING ") != " GNIRTSYM") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"MYSTRING \""; } 
    if (util::reverseString("aaaaaa") != "aaaaaa") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"aaaaaa\""; } 
    if (util::reverseString("This Is An Extended TEST") != "TSET dednetxE nA sI sihT") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"This Is An Extended Test\""; } 
    if (util::reverseString("\"\\\"Escape") != "epacsE\"\\\"") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"\"\\\"Escape\""; } 

    BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split)"; 
    std::vector<std::string> expected("One", "Two", "Three"); 
    std::vector<std::string> expected2("One", "Three"); 
    if (util::splitStrAtSubstr("One.Two.Three", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; } 
    if (util::splitStrAtSubstr("One\"Two\"Three", "\"") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One\"Two\"Three\", \"\"\""; } 
    if (util::splitStrAtSubstr("OneTwoThree", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; } 
    if (util::splitStrAtSubstr("OneTwoThree", "Two") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"OneTwoThree\", \"Two\""; } 

} 

void testing::UnitTester::logging() 
{ 
#include "Logger.hpp" 
} 

void testing::UnitTester::resourceGroup() 
{ 
#include "ResourceManager\ResourceGroup.hpp" 
} 

void testing::UnitTester::resourceManager() 
{ 
#include "ResourceManager\ResourceGroup.hpp" 
} 

void testing::UnitTester::INIParser() 
{ 
#include "INIParser.hpp" 
} 
#endif 

Вот что я считаю репрезентативной выборкой различных ошибок, которые я получаю. Я поставлю те, которые, как я думаю, больше всего подозревают на самом верху. Как часто они делают, многие ошибки просто вызваны из-за остальных ...

В объявлении функции в Utilities.hpp:

Ошибка 14 Ошибка C2039: «Вектор»: не является членом " std '
Ошибка 13 ошибка C2143: синтаксическая ошибка: отсутствует', 'до' & '
Ошибка 15 ошибка C2143: синтаксическая ошибка: отсутствует'; ' перед '<'
Ошибки 10 ошибки C2039: 'строки': не является член 'Std'

На BOOST_LOG_SEV вызывает в UnitTester.hpp:

Ошибки 69 Ошибка C2597: незаконная ссылка на нестатический Member 'testing :: UnitTester :: testLogger'
Ошибка 49 ошибка C2228: слева от '.stream' должен быть класс/структура/объединение Ошибка 63 ошибка C2228: слева от '.open_record' должен быть класс/структура/объединение

О вызовах функций в UnitTester.cpp:

Ошибка 51 Ошибка C2039: 'splitStrAtSubstr': не является членом 'Util'

Ошибка 31 ошибки C2664: 'INT Util :: reverseString (Const целое)': не может преобразовать аргумент 1 от «сопзЬ полукокса [10 ] 'to' const int ' ^^ происходит потому, что компилятор не может найти std :: string как тип, а по умолчанию - int

Это самая важная ошибка, которая кажется. Для меня проблема почти наверняка встречается в Utilities.hpp, где компилятор, похоже, не распознает std :: string и std :: vector и придумывает какую-то странную интерпретацию объявлений функций.

Заранее спасибо.

+0

Вы получаете сообщение об ошибке «vector» не указано в файле заголовка, где вы сначала делаете '#include '? Ты уверен? Похоже, что вы что-то не можете нам каким-то образом показать. Во-первых, вы никогда не '#include ' в любом месте, кроме как в 'Utilities.cpp', что не имеет смысла. –

ответ

1

Вы включаете файлы из внутренних тел функций, которые я не думаю, что они предназначены для использования как.

#include является предкомпиляционной директивой. Прекомпилятор запускается еще до запуска реального компилятора. Это позволяет изменять код. Подобно тому, как #define может заменить определенные слова, #include может включать целые файлы.

void testing::UnitTester::logging() 
{ 
#include "Logger.hpp" 
} 

Представьте, что компилятор будет на самом деле получить, как если бы вы заменили #include "Logger.hpp" с содержанием Logger.hpp.

Пожалуйста, не используйте #include внутри корпуса функции.

+0

Действительно, стандарт C++ специально говорит: «Единица перевода должна включать заголовок только вне любой внешней декларации или определения». Хотя стандарт говорит конкретно о заголовках, определенных стандартом, было бы разумно сделать то же самое для любого заголовка, за исключением некоторых очень редко встречающихся, которые специально разработаны для использования внутри определения функции. –

+0

Все это исправлено. Наверное, я пытался быть слишком фантазией. –

Смежные вопросы