2015-01-24 4 views
0

Я был в эти два дня сейчас ...Использование шаблона класса требует шаблона списка аргументов для массива

Я начинающий в C++, и у меня проблемы.

Я поставлю только минимальный код.

template <typename Type> 
class Array { 
     public: 

     *//stuff* 

     Array operator= (Array const &); 
}; 

template <typename Type> 
Array& Array<Type>::operator=(Array const &rhs) {  //ERROR #1 here 

*//stuff* 

}              //ERROR #2 here 

Я получаю следующие 2 ошибки

«Массив»: использование шаблона класса требует список аргументов шаблона
«Массив :: Оператор =»: не может соответствовать определению функции к существующей декларации

Пожалуйста, помогите.

Спасибо заранее

+0

возможно дубликат [использование шаблона класса требует список аргументов шаблона] (http://stackoverflow.com/questions/13477086/use-of-class-template-requires-template-argument-list) –

+0

@MohitJain Нет, это не точный дубликат. Сообщение об ошибке одно и то же, но проблема требует другого решения. – cdhowie

ответ

4

Возвращение тип определения должен быть определен явно как Array<Type> &. Это связано с тем, что компилятор не знает, что вы находитесь в контексте определения члена Array<Type> до тех пор, пока он не увидит Array<Type>::, поэтому до тех пор вы не можете использовать Array без аргументов шаблона.

template <typename Type> 
Array<Type>& Array<Type>::operator=(Array const &rhs) { 
// ^^^^^^ 

В качестве альтернативы, вы можете использовать auto синтаксис 11 C++, чтобы разрешить использование имени Array без аргументов шаблона, поскольку этот синтаксис определяет тип возврата после компилятор знает, какой контекст определение в.

template <typename Type> 
auto Array<Type>::operator=(Array const &rhs) -> Array& { 
//            ^^^^^^ 
// This works because the compiler has already encountered "Array<Type>::" 
+0

Спасибо! Не научились C++ 11, так что просто пошли с первой частью. Оно работает – Dan

0

для первой проверки ошибок это

Array<Type>& Array<Type>::operator==(Array<Type> const &rhs) 

Вы не можете использовать только Array Массив должен иметь argmunets <>

в классе

Array<Type> operator=(Array <Type> const &){} 
+2

Вы можете использовать 'Array' без аргументов типа * в контексте массива' Array ', поэтому вам не нужно использовать его для аргумента. ('Array const &' отлично там.) Проблема заключается в том, что компилятор еще не знает, что мы находимся в контексте экземпляра 'Array ', пока не увидим 'Array ::', поэтому возвращаемый тип не может использовать этот ярлык без возвращаемого типа C++ 11. – cdhowie