У меня есть следующий сокращенный код.
Линия с // Only VS
компилируется на VS, но не на clang,
И линия с // Only clang
компилируется на clang, но не на VS.
Кто такой человек? Что еще более важно, как создать эквивалентную линию для обоих?
Версии Испытуемые лязг 3.7.0 и VS 2015.Не удается получить шаблоны для компиляции под Visual Studio и clang
#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)...); // Only VS
B::template func(std::get<I>(t)...); // Only 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();
}
Как насчет 'this-> func (std :: get (t) ...);'? – Flexo
@Flexo: Это действительно работает, но почему? – Dani
'this-> func (std :: get (t) ...);' или 'B :: func (std :: get (t) ...);' должен работать, 'B :: шаблон func (std :: get (t) ...); 'недопустимо, потому что' func' не является шаблоном –