2014-11-12 3 views
1

Я пытаюсь скомпилировать простую программу, которая использует объявление псевдонима.Ошибка при использовании объявления псевдонима

Это код:

#include <iostream> 
using namespace std; 
using in = int; 

in main() 

{ 

    in a = 1; 

    cout << a << '\n'; 

    return 0; 

} 

Команда Я использую для компиляции является g++ -std=c++0x program_name.cxx, используя встроенный в терминал в Кейт на ОС Ubuntu. Но это не сработает! Любое предложение? (вместо этого используется typedef int in;).

+0

Я просто прошу вас попробовать его на терминале Ubuntu и посмотреть, если вы получите ту же самую ошибку. Какую версию g ++ вы используете? Он работает для меня с g ++ 4.8.2. проверьте с помощью «g ++ --version» – Scooter

+0

@Scooter g ++ 4.6.3. –

+0

Я бы попытался обновиться до нового компилятора, так как «g ++ -std = C++ 0x alias.cpp» работает с 4.8.2 с этим кодом – Scooter

ответ

3

Скомпилировать в режиме C++ 11. Type aliasing поддерживается только в C++ 11. Я подозреваю, что версия g++, использующая более старую и не полностью поддерживающую C++ 11, следовательно, не работает с c++0x.

Compile с: g++ -std=c++11 file.cpp

и it works.

Кстати, это, кажется, ужасная идея псевдонима int таким образом.

+0

@Blue Moon Извините, это просто пример, чтобы увидеть, работает ли надпись alias ... Если я использую -std = C++ 11, он говорит о непризнании опции командной строки. –

+0

Это означает, что ваш g ++ старше. Вы можете обновить его, если хотите использовать функции C++ 11. –

+0

@Blue Moon Хорошо, спасибо! Я использовал команду apt-get update как su. надеюсь это работает –

0

На самом деле это не ответ, но я не могу комментировать отсутствие репутации, и вы должны знать, когда используете объявления using: они могут ошибочно предоставлять доступ к закрытым членам в Visual C++ 2013 и ранее и в GCC (начиная с 6.3.0).

Следующий код не компилируется, но он делает:

class MyClass 
{ 
    struct MyStruct 
    { 
     template<bool> struct MyTemplate { static int constexpr Value = 0; }; 
    }; 
}; 

template<bool Condition> using MyAlias = MyClass::MyStruct::MyTemplate<Condition>; 

int main() 
{ 
    //error: 'struct MyClass::MyStruct' is private within this context 
    //return MyClass::MyStruct::MyTemplate<true>::Value; 
    return MyAlias<true>::Value; 
} 
Смежные вопросы