Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对函数模板进行某些专门化_C++_Templates_C++11_Friend - Fatal编程技术网

C++ 对函数模板进行某些专门化

C++ 对函数模板进行某些专门化,c++,templates,c++11,friend,C++,Templates,C++11,Friend,如果我有 template<class T> void f(T t); 请注意,我知道如何将整个模板声明为friend。[EDIT] 我是从一个声明这是可能的, 但是没有对它进行适当的测试。事实证明,这是行不通的, 所以请不要理会这个建议 据我所知,在C++中,OP想做什么是不可能的。 [/编辑] 您发布的代码将部分专门化函数f,但这是不允许的 要修复它,请从友元声明中删除空的尖括号: template<class T> class X { template &

如果我有

template<class T>
void f(T t);
请注意,我知道如何将整个模板声明为friend。

[EDIT] 我是从一个声明这是可能的, 但是没有对它进行适当的测试。事实证明,这是行不通的, 所以请不要理会这个建议

据我所知,在C++中,OP想做什么是不可能的。 [/编辑]

您发布的代码将部分专门化函数f,但这是不允许的

要修复它,请从友元声明中删除空的尖括号:

template<class T>
class X
{
    template <class U>  
    friend void f(T t, U, u);
};
模板
X类
{
样板
f(T,U,U);
};

> p>显然,当前C++没有办法完成我所做的工作。

这将涉及到某种类型的部分函数模板特化。既然这些是不允许的,我怀疑这是可能的。@jrok:到目前为止,这是我的怀疑。但是C++充满了惊奇。我希望有人能想出正确的语法,或者(按照标准)证明这是不可能的。在本例中,在名称空间范围内获得
f
声明的唯一方法是实例化某个X。我相信这不是OP想要的。我不确定我是否遵循。他只是想根据X的模板参数,限制f可能是X的朋友的实例化,对吗?这就是它的作用。当然,您需要实例化X才能真正知道应用了哪些函数f,我认为这是给定的。在OP
f
中,已经在命名空间范围中声明了。据我所知,他们不想只局限于某些专业,而只是想和其中一些人交朋友。现在,考虑到这一点,当你实例化一些
X
时,你会在名称空间范围内得到另一个超负荷的
f
,结果可能会有点令人惊讶,这取决于我们实例化X的方式和地点。现在尝试取消注释
X并重试。输出不同。很有趣。请注意,使用clang编译时不会发生这种情况。另外,您正在定义希望在类中成为朋友的函数,我认为OP不希望这样做,在这种情况下,这很好,但我明白您的意思,这很麻烦。您可以从全局范围访问f的专用版本,即使它没有在全局范围中声明,这是正常的吗?我以前从来没见过这个。。
template<class T>
class X
{
    friend void f<>(T t);
};
template<class T, class U>
void f(T t, U u);
template<class T>
class X
{
    template <class U>  
    friend void f<>(T t, U, u);
};
template<class T>
class X
{
    template <class U>  
    friend void f(T t, U, u);
};