interfacing c++ templates. Another c++-namespace issue?

Markus contact at markus-lanner.com
Fri Mar 16 18:57:31 UTC 2018


Hi

[template.cpp]:
template<typename Type>
void some_templated_function();

template<>
void some_templated_function<int>()
{}

[main.d]:
extern(C++) {
   void some_templated_function(Type)();
}

void main() {
   some_templated_function!int;
}

compilation:
g++ -c template_with_ns.cpp
dmd main.d template.o

this WORKS! :) BUT, now I put all c++ stuff into a namespace
[template_with_ns.cpp]:
namespace some_namespace {

template<typename Type>
void some_templated_function();

template<>
void some_templated_function<int>()
{}

}

[main_with_ns.d]:
extern(C++, some_namespace) {
   void some_templated_function(Type)();
}

void main() {
   some_templated_function!int;
}

DOES NOT compile
undefined reference to `void some_templated_function<int>()'

nm main_with_ns.o
_Z23some_templated_functionIiEvv
nm template_with_ns.o
_ZN14some_namespace23some_templated_functionIiEEvv

It seems like dmd doesn't care about the namespace of the 
template.
Can someone confirm this as a bug? or am I doing something 
terrible wrong? :)

When I retry this with gdc it doesn't compile. Neither with 
namespace nor without:
nm template.o:
_Z23some_templated_functionIiEvv
main.o:
_ZN23some_templated_functionIiE23some_templated_functionEv

The more I work with D, interfacing C++, the more I start to know 
"mangling" :D

Have fun
Markus


More information about the Digitalmars-d mailing list