long long (123) - ошибка компиляции
От: k55 Ниоткуда  
Дата: 05.08.15 02:25
Оценка:
День добрый.
Внезапно возник глупый вопрос не по C++11
https://ideone.com/smJnew

Почему тут ошибка? Недочет языка? Или в стандарте прописали что так делать нельзя?


#include <iostream>
using namespace std;

template <class T>
T GetVal(int a, T b)
{
    return b + 1;
}

int main() {
    cout << GetVal<long long>(1, 2) << endl;
    cout << GetVal(1,int(3)) << endl;
    cout << GetVal(1,char(52)) << endl;
    cout << GetVal(1,long long(52)) << endl;                        <------------ тут ошибка компиляции
    return 0;
}

prog.cpp:14:19: error: expected primary-expression before 'long'
  cout << GetVal(1,long long(52)) << endl;
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re: long long (123) - ошибка компиляции
От: _Artem_ Россия  
Дата: 05.08.15 04:35
Оценка: +1
Здравствуйте, k55, Вы писали:

k55>
k55>    cout << GetVal(1,long long(52)) << endl;                        <------------ тут ошибка компиляции
k55>    return 0;
k55>}

k55>prog.cpp:14:19: error: expected primary-expression before 'long'
k55>  cout << GetVal(1,long long(52)) << endl;
k55>


Попробуй так
cout << GetVal(1, (long long)(52)) << endl;
Re: long long (123) - ошибка компиляции
От: _DAle_ Беларусь  
Дата: 05.08.15 06:45
Оценка: 12 (3)
Здравствуйте, k55, Вы писали:

k55>
k55>    cout << GetVal(1,long long(52)) << endl;                        <------------ тут ошибка компиляции
k55>


В стандарте в 5.2.3 "Explicit type conversion (functional notation)" написано следующее:

A simple-type-specifier (7.1.6.2) or typename-specifier (14.6) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).


В 5.4 "Explicit type conversion (cast notation)", напомню, рассматривается синтаксис:
(T) expression


Теперь посмотрим, что такое simple-type-specifier:

simple-type-specifier:
nested-name-specifier? type-name
nested-name-specifier template simple-template-id
char
char16_t
char32_t
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
auto
decltype-specifier


То есть допускаются только одиночные type-specifier. long long, как и, например, short int состоят из нескольких type-specifier и не подходят к functional notation синтаксису.
Re: long long (123) - ошибка компиляции
От: Sheridan Россия  
Дата: 05.08.15 07:17
Оценка: +1
Здравствуйте, k55, Вы писали:
А почему не

#include <iostream>
#include <typeinfo>
using namespace std;

template <class T>
T GetVal(int a, T b)
{
    cout << typeid(b).name() << ": ";
    return b + 1;
}

int main() {
    cout << GetVal<long long>(1, 2) << endl;
    cout << GetVal(1,int(3)) << endl;
    cout << GetVal(1,char(52)) << endl;
    cout << GetVal(1,static_cast<long long>(52)) << endl;
    return 0;
}

sheridan@pc-0019 /tmp $ g++ -o aaa cpp.cpp
sheridan@pc-0019 /tmp $ ./aaa             
x: 3
i: 4
c: 5
x: 53
Matrix has you...
Отредактировано 05.08.2015 7:27 Sheridan . Предыдущая версия . Еще …
Отредактировано 05.08.2015 7:21 Sheridan . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.