Явное ключевое слово в MS Visual Studio 4.1 - PullRequest
2 голосов
/ 30 ноября 2010

Я реализую класс интеллектуального указателя с использованием обобщений, и я хотел заставить пользователей этого класса правильно создавать интеллектуальный указатель с использованием синтаксиса, такого как

 MyReference<TestCls>(mytest3))

или

MyReference<TestCls> mytest4(new TestCls());

поэтому я использовал явное ключевое слово в CTOR, чтобы предотвратить это:

MyReference aRef = NULL;

Однако из-за неблагоприятных обстоятельств, не зависящих от меня, я работаю над кодом, скомпилированным с использованием древнего компилятора MSVC ++ 4.1. Когда я включаю явное ключевое слово, я получаю следующие ошибки:

MyReference.h (49): ошибка C2501: «явный»: отсутствуют спецификаторы decl
MyReference.h (51): ошибка C2143: синтаксическая ошибка: отсутствует ';' до ''
MyReference.h (52): ошибка C2238: неожиданные маркеры перед ':'
MyReference.h (52): ошибка C2059: синтаксическая ошибка: 'int constant'

Когда я добавляю #define explicit, эти ошибки исчезают. Это был хак с моей стороны, просто чтобы компилятор игнорировал ключевое слово. Я предполагаю, что это означает, что явное не поддерживается компилятором yon olde. Может кто-то подтвердить это, и есть ли кто-нибудь там со знанием обходного решения для этого?

Merci Beaucoups, Деннис.

1 Ответ

2 голосов
/ 30 ноября 2010

Этот сайт имеет обходной путь для этого, а именно:

К сожалению, старые компиляторы могут не поддерживать использование «явного», что может быть головной болью.Если вы застряли в работе с устаревшим компилятором и не можете получить тот, который имеет лучшую поддержку стандарта C ++, вашим лучшим решением может быть использование того факта, что будет иметь место только одно неявное преобразование дляданное значение.Вы можете использовать это, используя промежуточный класс, который неявно создает объект каждого типа, и затем ваш основной класс неявно создает объекты из этого класса:

class proxy
{
    public:
    proxy(int x) : x(x) {} ;
    getValue() { return x; }

    private:
    int x;

};

class String
{
    // this will be equivalent of explicit
    String(proxy x) { /* create a string using x.getValue(); */ }
}
...