C ++:正确的模板参数的模板类型成员的语法?

时间:2015-04-29 13:36:28

标签: c++ templates c++11 using friend

我有一个采用模板类型参数(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 >;

但那太可惜了。

有谁知道如何做到这一点,或者是否可以这样做?

1 个答案:

答案 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接受......