diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index 49effcef..f3bc50d6 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -537,11 +537,11 @@ namespace CppSharp.Generators.CSharp var names = new Stack(); Declaration ctx; - var specialization = decl as ClassTemplateSpecialization; - if (specialization != null && ContextKind == TypePrinterContextKind.Native) + if (decl is ClassTemplateSpecialization specialization) { ctx = specialization.TemplatedDecl.TemplatedClass.Namespace; - if (specialization.OriginalNamespace is Class && + if (ContextKind == TypePrinterContextKind.Native && + specialization.OriginalNamespace is Class && !(specialization.OriginalNamespace is ClassTemplateSpecialization)) { names.Push(string.Format("{0}_{1}", decl.OriginalNamespace.Name, decl.Name)); diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h index f421cf1d..54353cc0 100644 --- a/tests/NamespacesBase/NamespacesBase.h +++ b/tests/NamespacesBase/NamespacesBase.h @@ -76,7 +76,7 @@ void TemplateClass::setField(const T& value) } template -class DLL_API TemplateWithIndependentFields +class TemplateWithIndependentFields { public: void useDependentPointer(const T* t); diff --git a/tests/NamespacesDerived/NamespacesDerived.Tests.cs b/tests/NamespacesDerived/NamespacesDerived.Tests.cs index ea8fc290..b6192a13 100644 --- a/tests/NamespacesDerived/NamespacesDerived.Tests.cs +++ b/tests/NamespacesDerived/NamespacesDerived.Tests.cs @@ -13,6 +13,8 @@ public class NamespaceDerivedTests public void TestCodeGeneration() { using (new DerivedFromSecondaryBaseInDependency()) { } + using (var der2 = new Derived2()) + using (der2.ExplicitExternalSpecialization) { } } [Test] diff --git a/tests/NamespacesDerived/NamespacesDerived.cpp b/tests/NamespacesDerived/NamespacesDerived.cpp index 8bd6c775..01462f14 100644 --- a/tests/NamespacesDerived/NamespacesDerived.cpp +++ b/tests/NamespacesDerived/NamespacesDerived.cpp @@ -70,6 +70,11 @@ TemplateClass Derived2::getTemplate() return t; } +TemplateWithIndependentFields Derived2::getExplicitExternalSpecialization() +{ + return TemplateWithIndependentFields(); +} + Abstract* Derived2::getAbstract() { return 0; diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index a30af2f6..0e9964aa 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -45,6 +45,11 @@ class Base3 template class TemplateClass; +template<> +class DLL_API TemplateWithIndependentFields +{ +}; + class DLL_API Derived2 : public Base3 { public: @@ -60,6 +65,7 @@ public: void defaultEnumValueFromDependency(OverlappingNamespace::ColorsEnum c = OverlappingNamespace::ColorsEnum::black); TemplateClass getTemplate(); + TemplateWithIndependentFields getExplicitExternalSpecialization(); Abstract* getAbstract(); private: TemplateClass t;