2012-01-02 5 views
0

Ниже код заставил меня путать:Перегрузки и Шаблон Комбинированный

  1. Я ожидал operator+<int> дать ошибку во время компиляции, так как оператор перегрузки мандатов по крайней мере, один не-собственного типа. Если я попробую int operator+(int i, int j), он терпит неудачу. Но это не создавало никаких проблем, почему?

  2. Если я звоню 2+3, не звонит ли он operator+, я должен явно указать operator+<int>?

  3. Есть ли лучший способ, кроме того, написать operator+<int>, чтобы назвать мое определение operator+?

  4. Есть ли место, куда я могу обратиться, что объясняет это лучше?

ПРИМЕЧАНИЕ: Я использовал "Sun C++ 5,10"

#include <iostream> 

using namespace std; 

template <typename T> 
T operator+(T i, T j) 
{ 
     return i+j; 
} 

int main() 
{ 
     cout<<2+3; 
     cout<<operator+<int>(2,3); 
     cout<<endl; 
} 

Выход, как показано ниже,

bash-2.03$ ./a.out 

55 
+0

Как вы определили '2?'? – thiton

+1

Я не уверен, в чем проблема. Вам известно, что вы не можете создать функцию 'operator + (int, int)', и вы создали функцию 'operator + (int, int)', что не то же самое ... –

+0

operator + Код ошибки: . Поэтому я думал, что если operator + (int, int) не разрешен, то оператор + (int, int) также не должен быть разрешен. Поскольку шаблоны разрешаются во время компиляции. – rakesh

ответ

1

Я думаю, что ответ на этот вопрос достаточно прост: это ошибка компилятора! Соответствующая цитата приведена выше. Пункт 6, первое предложение (от C++ 2011):

Операторская функция должна быть либо нестатической функцией-членом, либо быть нечленой функцией и иметь как минимум одну параметр, тип которого представляет собой класс, ссылку на класс, перечисление или ссылку на перечисление.

Я проверил ваш код с текущими версиями интерфейса EDG, g ++ и clang ++, и все они правильно отклонили код.

+0

Является ли законным писать шаблон для функции оператора, который позволяет создавать экземпляры с типами, которые не являются определенными пользователем типами? В этом случае, просто попытка явно создать шаблон для 'int', который является недопустимым или сам объявление шаблона недействителен? –

+0

Вот как это должно было быть. Возможно, sunStudio10 не поддерживает это. Я уверен, что объявление такого шаблона будет разрешено, но компилятор будет жаловаться, как и должно быть. – rakesh

+0

@CharlesBailey: вы можете писать шаблоны, которые выглядят так, как будто они могут быть созданы, например. оператор выше. Однако соответствующий экземпляр не должен рассматриваться или не учитываться (т. Е. Компилятор не пытается создать экземпляр оператора). –

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