gpt4 book ai didi

c++ - 如何与模板化类的构造函数成为 friend ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:26 25 4
gpt4 key购买 nike

为什么

class A;
template<typename T> class B
{
private:
A* a;

public:
B();
};


class A : public B<int>
{
private:
friend B<int>::B<int>();
int x;
};


template<typename T>
B<T>::B()
{
a = new A;
a->x = 5;
}

int main() { return 0; }

结果

../src/main.cpp:15: error: invalid use of constructor as a template
../src/main.cpp:15: note: use ‘B::B’ instead of ‘B::class B’ to name the constructor in a qualified name

还在改变friend B<int>::B<int>()friend B<int>::B()结果

../src/main.cpp:15: error: no ‘void B::B()’ member function declared in class ‘B’

同时完全删除模板

class A;
class B
{
private:
A* a;

public:
B();
};


class A : public B
{
private:
friend B::B();
int x;
};


B::B()
{
a = new A;
a->x = 5;
}

int main() { return 0; }

编译和执行都很好——尽管我的 IDE 说 friend B::B() 语法无效?

最佳答案

根据 CWG defect 147 的决议(该决议已合并到 C++03 中),命名类模板特化的非模板构造函数的正确方法是:

B<int>::B();

不是

B<int>::B<int>();

如果允许后者,当你有一个类模板特化的构造函数模板特化时会出现歧义:第二个 <int>是类模板还是构造函数模板? (有关更多信息,请参阅上面链接的缺陷报告)

因此,将类模板特化的构造函数声明为友元的正确方法是:

friend B<int>::B();

Comeau 4.3.10.1 和 Intel C++ 11.1 都接受这种形式。 Visual C++ 2008 和 Visual C++ 2010 都不接受该形式,但都接受(不正确的)形式 friend B<int>::B<int>(); (我将在 Microsoft Connect 上提交缺陷报告)。

gcc 在 4.5 版之前不接受任何一种形式。 Bug 5023针对 gcc 3.0.2 进行了报告,但错误报告中请求的解决方案是无效形式。看来分辨率为bug 9050也解决了这个问题并且 gcc 4.5 接受了正确的形式。 Georg Fritzsche 在对该问题的评论中证实了这一点。

关于c++ - 如何与模板化类的构造函数成为 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2823485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com