У меня есть шаблонная функция, которая использует локальный класс, производный от другого базового класса.Когда эта функция создается в разных блоках компиляции, компоновщик выдает ошибки «множественного определения» для конструктора и деструктора по умолчанию.
Ниже приведена развернутая версия некоторого кода, которая вызывала у меня проблемы.Он состоит из трех файлов.Это должен быть действительный (?) Код C ++:
ах:
struct foo {
template <typename T>
void f(const T&);
};
struct base {
virtual ~base(){};
};
template <typename T>
void foo::f(const T&) {
struct derived: public base {
// derived(){}
// virtual ~derived(){}
};
derived x;
}
a.cpp:
#include "a.h"
void fa() {
foo a;
a.f(1);
}
int main(int argc, char *argv[]){}
b.cpp:
#include "a.h"
void fb() {
foo a;
a.f(1);
}
При компиляции это приводит к ошибке компоновщика, поскольку конструктор и деструктор производного используются там дважды:
$ g++ a.cpp b.cpp
/tmp/ccvPK1l5.o: In function `void foo::f<int>(int const&)::derived::derived()':
b.cpp:(.text+0x24): multiple definition of `void foo::f<int>(int const&)::derived::derived()'
/tmp/ccRb6RYO.o:a.cpp:(.text+0x36): first defined here
[...]
Интересно, если вы вручную определяете конструктор и деструктор производного (раскомментируя две строки), все работает отлично.
Есть ли что-то недействительное в моем коде или это ошибка в gcc?Я попробовал gcc 4.3 и 4.4, оба имеют одну и ту же проблему.
Для моего реального кода я решил ситуацию, объявив «производный» как глобальный класс, а не локальный внутри класса f.Но мне все равно было бы интересно узнать, что идет не так и почему, чтобы я мог избежать этого в будущем.