无法获取模板以在 Visual Studio 和 clang 下编译
Cannot get templates to compile under Visual Studio and clang
我有以下缩小代码。
带有 // Only VS
的行在 VS 上编译但不在 clang 上编译,
带有 // Only clang
的行在 clang 上编译,但在 VS 上不编译。
谁是正确的?更重要的是,如何在两者上编译等效行?
测试的版本是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)...); // 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();
}
我认为两者都是错误的。第一次使用 func(...)
是使用参数相关查找查找的非限定名称,它在基 class 中找不到函数。 B::template func(...)
的使用使用了多余的关键字template
。您可以使用
在 class 的上下文中强制查找 func
this->func(...);
this->
强制必要的上下文。我认为 B::func(...)
也应该有效,但我在类似情况下使用 this->func(...)
。
我认为相关条款是 14.6.2 [temp.dep] 第 3 段:
In the definition of a class or class template, the scope of a dependent base class (14.6.2.1) is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.
问题是 B
依赖于封闭 class 的模板参数。使用 this->
或基本 class 名称强制在基本 class 上下文中查找名称。
我有以下缩小代码。
带有 // Only VS
的行在 VS 上编译但不在 clang 上编译,
带有 // Only clang
的行在 clang 上编译,但在 VS 上不编译。
谁是正确的?更重要的是,如何在两者上编译等效行?
测试的版本是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)...); // 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();
}
我认为两者都是错误的。第一次使用 func(...)
是使用参数相关查找查找的非限定名称,它在基 class 中找不到函数。 B::template func(...)
的使用使用了多余的关键字template
。您可以使用
func
this->func(...);
this->
强制必要的上下文。我认为 B::func(...)
也应该有效,但我在类似情况下使用 this->func(...)
。
我认为相关条款是 14.6.2 [temp.dep] 第 3 段:
In the definition of a class or class template, the scope of a dependent base class (14.6.2.1) is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.
问题是 B
依赖于封闭 class 的模板参数。使用 this->
或基本 class 名称强制在基本 class 上下文中查找名称。