Потребовалось создать шаблон, делал все как обычно принято в 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, они неподходят по нескольким причинам)
Я не понял что вы хотите, если честно.
Но вот так работает:
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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Помогите создать иерархию объектов, которые содержат информацию о комплектации ПК
Создаю обычный проект qt widgets с формойДобавляю на форму layout, на него кидаю банальный textedit и button через дизайнер, ставлю в sizepolicy везде expanding
Можно ли задать аргумент по умолчанию для rvalue ссылки, например, так: