Декларация и реализация шаблона

217
19 апреля 2018, 11:57

Потребовалось создать шаблон, делал все как обычно принято в C/C++, сначала декларацию в header файле, а потом и реализацию в cpp файле, разумеется были ошибки линкинга, позже мне пояснили, что так нельзя и нужно реализацию делать в header файле, но проблема в том, что если я ее сделаю в header файле, то у меня будут ошибки:

incomplete type ‘...’ used in nested name specifier

Вот мой код в упрощенном виде:
a.h:

#pragma once
#include "b.h"
class A {
public:
    static A *test(A *q) {
        return q;
    };
};

b.h:

#pragma once
#include "a.h"
class A;
template <typename T = A>
T *test2(T *arg);

b.cpp:

#include "a.h"
template <typename T = A>
T *test2(T *arg) {
    return (T *)A::test(arg);
}

c.cpp:

#include "a.h"
#include "b.h"
int main() {
    A q;
    test2(&q);
    return 0;
}

Тут будут проблемы с линкингом ибо шаблон реализован неправильно, но если перенести реализацию шаблона из b.cpp в b.h, то ошибка уже будет такая:

In file included from a.h:3:0, from c.cpp:1: b.h: In function ‘T* test2(T*)’: b.h:8:20: error: incomplete type ‘A’ used in nested name specifier return (T *)A::test(arg);

Выходит патовая ситуация, как ее можно разрешить?(без использования extern templates, они неподходят по нескольким причинам)

Answer 1

Я не понял что вы хотите, если честно.

Но вот так работает:

A.h:

#pragma once
class A
{
public:
    static A* test(A* q){
        return q;
    }
};

b.h:

#pragma once
#include "a.h"

template <typename T = A>
T *test2(T *arg){
    return T::test(arg);
}

main.cpp:

#include "a.h"
#include "b.h"
int main()
{
    A q;
    test2(&q);
    return 0;
}
READ ALSO
Как объявить static переменную в классе?

Как объявить static переменную в классе?

Переменную объявил так:

171
Иерархия объектов в C++ [требует правки]

Иерархия объектов в C++ [требует правки]

Помогите создать иерархию объектов, которые содержат информацию о комплектации ПК

169
Расширяющаяся форма в qt

Расширяющаяся форма в qt

Создаю обычный проект qt widgets с формойДобавляю на форму layout, на него кидаю банальный textedit и button через дизайнер, ставлю в sizepolicy везде expanding

163
Аргумент по умолчанию для rvalue ссылки

Аргумент по умолчанию для rvalue ссылки

Можно ли задать аргумент по умолчанию для rvalue ссылки, например, так:

193