繁体   English   中英

限制类的模板朋友

[英]Restrict template friends of a class

请考虑以下代码:

#include <iostream>

class S {
    static const int i = 42;
    template <class T>
    friend void f();
};

template <class T>
void f()
{
    std::cout << S::i << "\n";
}

int main() 
{
    f<int>();
    f<double>();
}

我想要的是允许访问类S私有部分到f<int> ,但不允许访问f<double> 即我想得到编译器错误,例如'i' is a private member of 'S' f<double>()'i' is a private member of 'S'

如何实现这一目标?

模板实例化是一个函数,所以只需命名它: void f<int>()

但是,您需要事先声明:

[C++03: 11.4/9 | C++11/C++14: 11.3/11]: [C++03: 11.4/9 | C++11/C++14: 11.3/11]:如果朋友声明出现在本地类(9.8)中并且指定的名称是非限定名称,则会查找先前的声明,而不考虑最里面的范围包含非类范围。 对于朋友函数声明,如果没有事先声明,则程序格式错误。 [..]

(这不是你最初的friend -inside-template-declaration的情况,因为在解析过程中稍后会查找模板。)

这是完成的解决方案:

#include <iostream>

template <class T>
void f();

class S {
    static const int i = 42;
    friend void f<int>();
};

template <class T>
void f()
{
    std::cout << S::i << "\n";
}

int main() 
{
    f<int>();
    f<double>();
}

现在唯一的错误是由f<double>()调用引起的。

现场演示

您需要在类S之前声明(或仅定义)模板函数。 然后你可以说你希望它成为f<int>()朋友。 像这样:

template <class T> void f();

class S {
    static const int i = 42;
    friend void f<int>();
};

template <class T>
void f()
{
    std::cout << S::i << "\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM