2014-10-30 8 views
2

Я создаю пользовательский класс матрицы с шаблонами для образовательных целей. Я хочу, чтобы мой класс работать следующим образом:двоичный 'оператор *' имеет слишком много параметров

mat*2; //Works 
2*mat; //Should also work 

В первом случае я имею следующую декларацию

matrix<T> operator*(const T& a) const; 

и implemenetation

template <typename T> 
matrix<T> matrix<T>::operator*(const T& a) const{ 
//Implementation here 
} 

В то время как во втором случае я должны сделать реализацию в качестве нечленов класса

matrix<T> operator*(T& a, matrix<T>& mat); 

с реализацией

template<typename T> 
matrix<T> operator*(T& a, const matrix<T>& mat){ 
    return mat*a; 
} 

Однако, когда я пытаюсь скомпилировать это я получаю следующее сообщение об ошибке с помощью MSVC

error C2804: binary 'operator *' has too many parameters 
..\main.cpp(33): error C2678: binary '*' : no operator found which takes a left hand operand of  type 'int' (or there is no acceptable conversion) 
+1

Пожалуйста, добавьте больше контекста. Мое подозрение в том, что вы поставили 'matrix operator * (T & a, matrix & mat);' в определении класса. –

+1

Попробуйте добавить 'const' к параметрам второй функции? Вероятно, он не может передать неконстантную ссылку на literal '2'. –

+0

Я сделал это и сработал. Могли бы вы оба объяснить, почему это так? Я пытаюсь узнать больше на C++ здесь. :) – msmechanized

ответ

4

Первый тип параметра должен быть либо T или T const &.

неконстантная именующего ссылка не может связываться с буквальным, как 2 (или к временному или const объекту или ссылке).

2

Согласно моему комментарию: метод нестатического класса имеет неявный первый параметр типа класса (*this). Оператор, который вы определяете, если он помещен в определение класса, будет иметь три параметра (в то время как двоичный код operator* должен иметь только 2). Если вы поместите объявление оператора в определение класса, вам нужно удалить первый параметр и напрямую работать с полями класса.

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