c++ - Cannot get templates to compile under Visual Studio and clang -
i have following minified code.
line // vs
compiles on vs not on clang,
, line // clang
compiles on clang not on vs.
correct? more importantly, how make equivalent line compile on both?
versions tested clang 3.7.0, , vs 2015.
#include <functional> #include <tuple> template<typename... args> class c { struct b { std::function<void(args...)> func; b(std::function<void(args...)> func) : func(func) { } }; template<typename t> struct d : b { using b::b; template<size_t... i> void call(t &t, std::index_sequence<i...>) { func(std::get<i>(t)...); // vs b::template func(std::get<i>(t)...); // clang } }; d<std::tuple<args...>> d; public: c(std::function<void(args...)> func) : d(func) { } void call() { std::tuple<args...> t; d.call(t, std::make_index_sequence<sizeof...(args)>()); } }; void f(int) { } int main() { c<int> c(f); c.call(); }
i think both wrong. first use func(...)
unqualified name looked using argument dependent look-up doesn't find function in base class. use of b::template func(...)
uses excess keyword template
. can force look-up of func
in context of class using
this->func(...);
the this->
forces necessary context. think, b::func(...)
should work i'm using this->func(...)
in similar situations.
i think relevant clause 14.6.2 [temp.dep] paragraph 3:
in definition of class or class template, scope of dependent base class (14.6.2.1) not examined during unqualified name lookup either @ point of definition of class template or member or during instantiation of class template or member.
the issue b
dependent on template arguments of enclosing class. qualifying name this->
or base class name force look-up in base class context.
Comments
Post a Comment