Вы используете шаблонный класс неправильно.Должно работать следующее:
namespace QQQ
{
namespace B
{
class B
{
// Note the template parameter (int)
AAA::A<int> obj;
public:
bool GetResult() const
{
// Note the parentheses and the "obj"
return obj.fooA()
}
};
}
}
Единственная проблема, которую я могу себе представить с этим кодом, - это неоднозначность между пространством имен B
и классом B
, но полностью квалифицированный вызов (QQQ::B::B
)должно работать.
В соответствии с вашим симптомом (ошибка компоновщика при вызове из пространства имен, отличного от A
, но нет ошибок компоновщика, если также вызывается из пространства имен A
), тогда - при условии, что ваш синтаксисправильно в вашем реальном коде - ваша проблема в том, что вы не правильно создаете экземпляр шаблона.Шаблоны являются конструкциями времени компиляции, и поэтому они действительно не могут быть скомпилированы в DLL.Вместо этого шаблон должен быть правильно создан во время компиляции.Когда вы не получаете ошибок компоновки, это потому, что шаблон правильно создан, а когда вы получаете ошибки компоновки, это потому, что его не было.
Из-за символа DLL_EXPORT
я предполагаю, что выиспользуя Visual C ++.Тем не менее, у ребят из GCC есть хорошая запись , которая также применима к Visual Studio.Большинство шаблонных библиотек, с которыми я знаком (например, Boost), требуют, чтобы все шаблоны были объявлены и определены в заголовочном файле.Также допустимо явно создавать экземпляры шаблонов, как рекомендовано ребятами из GCC.