Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
freecoder
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 8
#1

Ошибка в определении шаблонного метода - C++

13.05.2016, 11:02. Просмотров 148. Ответов 2
Метки нет (Все метки)

Подскажите пожалуйста, что делаю не так в определении шаблонного метода.
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// test.cpp
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
template <typename T, typename X>
class Base {
public:
    T foo(X a);
protected:
    T b = 1;
};
 
template <typename T>
class Foo: public Base<T, Foo<T> > {
public:
    T bar();
};
 
template <typename T>
T Base<T, Foo<T> >::foo(Foo<T> a) {
    return a.bar();
}
 
template <typename T>
T Foo<T>::bar() {
    return this->b;
}
 
int main() {
    Foo<double> f;
    cout << "Foo: " << typeid(f).name() << endl;
    cout << "Foo.foo: " << f.foo(f) << endl;
}
При попытке скомпилировать выдает следующую ошибку:
Bash
1
2
3
4
5
6
7
$ g++ -std=c++14 -o test test.cpp 
test.cpp:22:33: error: invalid use of incomplete type ‘class Base<T, Foo<T> >’
 T Base<T, Foo<T> >::foo(Foo<T> a) {
                                 ^
test.cpp:8:7: error: declaration of ‘class Base<T, Foo<T> >’
 class Base {
       ^
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2016, 11:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка в определении шаблонного метода (C++):

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого...

Синтаксическая ошибка при определении метода перегруженного оператора,за классом
Есть два класса. Point1 и Pointer1 Синтаксическая Ошибка в Pointer1.cpp в...

Decltype при определении возвращаемого типа в перегруженных операторах шаблонного класса
Для всех следующих примеров будет использован main(): #include &lt;iostream&gt; int...

Вызов шаблонного метода в зависимости от условия
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;queue&gt; #include &lt;type_traits&gt;...

Вынести реализацию шаблонного метода в cpp
Есть класс с публичным шаблонным методом. В заголовочном файле определен этот...

Аргументы шаблонного метода как объекты
Не могу решить одну задачу. вот три класса class win {}; class obj1...

2
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
13.05.2016, 11:12 #2
Вы пытаетесь определить функцию член специализированного шаблона без объявления самой специализации шаблона.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// test.cpp
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
template <typename T, typename X>
class Base {
public:
    T foo(X a);
protected:
    T b = 1;
};
 
template <typename T>
class Foo: public Base<T, Foo<T> > {
public:
    T bar();
};
 
template <typename T>
class Base<T, Foo<T>> {
public:
    T foo(Foo<T> a);
protected:
    T b = 1;
};
 
template <typename T>
T Base<T, Foo<T>>::foo(Foo<T> a) {
    return a.bar();
}
 
template <typename T>
T Foo<T>::bar() {
    return this->b;
}
 
int main() {
    Foo<double> f;
    cout << "Foo: " << typeid(f).name() << endl;
    cout << "Foo.foo: " << f.foo(f) << endl;
}
1
freecoder
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 8
13.05.2016, 12:11  [ТС] #3
Спасибо!

Тогда такой вопрос: могу ли я каким-то образом вынести повторяющиеся функции в некий "базовый шаблон", чтобы не переписывать их десять раз? Например, у меня есть классы Foo1, Foo2, ... у которых должен быть метод T foo(FooN a), где FooN - соответствующий класс, в котором этот метод объявлен.

Сейчас получается что я вынужден все равно объявить специализацию для каждого класса Foo1, Foo2, ... по сути повторив объявление метода foo в каждом случае. Или нет?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2016, 12:11
Привет! Вот еще темы с решениями:

Функция как аргумент шаблонного метода класса
Пытаюсь передать функцию для сравнения в сортировке слиянием, но что-то не...

Реализация шаблонного метода с переменным числом параметров
Добрый день! Не могу придумать, как реализовать метод, позволяющий принимать...

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

Ошибка в определении структурного типа
В строке 40 выдает ошибку &quot;error C2440: 'initializing' : cannot convert from...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru