我有一个采用模板类型参数(tTRAIT)的类。我想知道tTRAIT的模板类型 成员 别名,但我无法弄清楚语法。 (这有可能吗?)。
template <bool bBOOL>
struct SFoo {};
struct STrait
{
template <bool bBOOL>
using TFoo = SFoo<bBOOL>;
};
template <typename tTRAIT>
struct SBar
{
template <bool bBOOL>
friend typename tTRAIT::template TFoo<bBOOL>;
};
SBar<STrait> bar;
Clang的错误(在friend
行上)是:
error: friend type templates must use an elaborated type
我试过用尽我能想到的所有可能的组合:
friend tTRAIT::TFoo;
friend tTRAIT::template TFoo;
friend typename tTRAIT::TFoo;
friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::TFoo;
template <bool bBOOL> friend tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend tTRAIT::template TFoo;
template <bool bBOOL> friend tTRAIT::template TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::TFoo;
template <bool bBOOL> friend typename tTRAIT::TFoo<bBOOL>;
template <bool bBOOL> friend typename tTRAIT::template TFoo;
template <bool bBOOL> friend typename tTRAIT::template TFoo<bBOOL>;
我也尝试使用using
,但它似乎没有帮助。
作为一个丑陋的黑客(只适用于bool参数),我可以通过手动为每个专业化提供支持来实现它。
friend typename tTRAIT::template TFoo<false>;
friend typename tTRAIT::template TFoo<true >;
但那太可惜了。
有谁知道如何做到这一点,或者是否可以这样做?
答案 0 :(得分:2)
我可以在std = c ++ 11模式下继续使用Clang 3.4.1。
编译时没有错误:
模板
struct SBar
{
private:
int j;
public:
template <bool bBOOL>
friend struct tTRAIT::TFoo;
void setJ(int j) {
this->j = j;
}
};
但是......我收到了这个警告:警告:依赖的嵌套名称说明符&#39; tTRAIT ::&#39;不支持朋友模板声明;忽略这个朋友声明[-Wunsupported-friend]:朋友结构tTRAIT :: TFoo;
我可以确认SFoo
类不是朋友(private j
的原因......)
我能编译和运行的唯一方法是:
struct SBar
{
private:
int j;
public:
template <bool bBOOL>
friend struct sFoo;
void setJ(int j) {
this->j = j;
}
};
很好,SFoo
类是朋友,但它有点违背OP要求([模板参数]的模板类型成员)...
我目前无法访问最近的gcc,但我认为我们处于编译器如何解释标准的边缘。我阅读了TartanLlama引用的章节,但无法确定这是否有意。也许我的第一次尝试会被gcc接受......