Побаловаться с namespace

Собственно сабж. Есть большой проект, в котором к сожалению есть пересечение стандартного имени и имени класса. Есть костыльное решение(приведено ниже)
#include <iostream>
using namespace std;
 
enum eType{
    cTest = 1
};
 
namespace testspace{
    class cTest{
        public:
        int a;
    };
}
 
 
class cData{
    public:
    testspace::cTest test;
};
 
int main(){
    cData data;
    data.test.a = 5;
    cout<<data.test.a<<endl;
    return 0;
}
http://codepad.org/hsVE57ZSЭто глупо звучит, но есть ли возможность как то использовать using в самом теле класса, уж больно testspace::cTest режет глаза(в теле cData есть куча методов с параметром testspace::cTest, вдобавок таких классов как cData много, очень много)?Конечно можно переименовать класс cTest , но в контексте данной проблемы - переименование неприемлемо. Хочется что- то вида
{
     using namespace testspace;
     cTest test;
}
- но в объявлении класса, это не работает, да и методы в срр-шнике надо всё равно экранировать спейсом. Возможно у кого то есть элегантное решение?Небольшой аддишн:
enum eType{ * * cTest = 1 };
- изменять ни в коем случае нельзя (системное оно). объявление энума идёт в хашнике в гайде
#ifdef TEST 
#define TEST
enum eType{
    cTest = 1
};
 #endif
, если можно как то отключить на участке кода сие"чудо" тоже сойдёт, но #undef тоже ни к чему ни привёл
9 ответов

class cData {
public:
    using cTest = testspace::cTest;
    cTest test;
};
Так не подойдет?


stzer, http://codepad.org/HZuCicQl не не оно
Line 18: error: expected nested-name-specifier before 'cTest' compilation terminated due to -Wfatal-errors.
но спасибо за отклик.


Unknownx, c++11 включен?


Вобщем пока остановился на этом + #undef вконце
#include <iostream>
using namespace std;
 
enum eType{
    cTest = 1
};
 
namespace testspace{
    class cTest{
        public:
        int a;
    };
}
 
 
class cData{
    public:
    #define cTest testspace::cTest
    cTest test;
    void  func(cTest &test){
        test.a = 8;
    }
};
 
int main(){
    cData data;
    data.test.a = 5;
    data.func(data.test);
    cout<<data.test.a<<endl;
    return 0;
}
http://codepad.org/fLM7EiHl
Unknownx, c++11 включен?
- сейчас гляну в ideone.com (я в xcode собираю, там надо чтобы gnu++0x диалект был, тоже свои заманухи), но попробую всё ранво


Unknownx, пихни в класс typedef testspace::cTest cTest;, раз c++11 не поддерживает.


Короче думаю остановлюсь на таком варианте
#include <iostream>
using namespace std;
 
enum eType{
    cTest = 1
};
 
 
#define CTEST cTest 
namespace testspace{
    class cTest{
        public:
        int a;
    };
}
 
#define cTest testspace::cTest
class cData{
    public:
    cTest test;
    void  func(cTest &test);
};
 
void cData::func(cTest &test){
     test.a = 8;
}
 
int main(){
    cData data;
    data.test.a = 5;
    data.func(data.test);
    cout<<data.test.a<<endl;
    return 0;
}
 
#undef cTest
#define cTest CTEST
Кстати ideone.com с ключом С++14 тоже собрал http://ideone.com/ZVageU


да в качестве элегантного костыля сойдёт
typedef никогда костылем не считался -_-


typedef никогда костылем не считался -_-
- да согласен, я плохо выразился. Скорее надо читать - в качестве "таблэтки" самое оно ************, вобщем как раз то что мне надо было - "дешево и сердито" + С+11 не надо и дефайнов с андефами
#include <iostream>
using namespace std;
 
enum eType{
    cTest = 1
};
 
namespace testspace{
    class cTest{
        public:
        int a;
    };
}
 
 
class cData{
    public:
    typedef testspace::cTest cTest;
    cTest test;
    void func(cTest &test);
    
};
 
void cData::func(cTest &test){
        test.a = 8;
}
 
int main(){
    cData data;
    data.test.a = 5;
    data.func(data.test);
    cout<<data.test.a<<endl;
    int b = cTest;
    cout<<b<<endl;
    return 0;
}
http://codepad.org/Fc6hYitWstzer, ************, спасибо Вам мужики!


С+11 не надо
Сейчас практически любой компилятор поддерживает C++11 полностью =).В конечном счете выбор за вами.