【发布时间】:2011-05-16 00:33:04
【问题描述】:
可能重复:
Making an undefined class as friend, and defining it later.
我有以下代码
template<typename T>
class A
{
class B;
B b;
};
int main()
{
return 0;
}
代码不会发出任何错误,因为 A 没有被实例化。我说的对吗?
但是看看第二个代码示例
template<typename T>
class A
{
protected:
class a
{
int x;
int y;
private:
friend class b;
};
template <typename U > class b
{
int z;
U y;
};
};
int main()
{
A<int> a;
return 0;
}
在这种情况下,A 被实例化,但 b 没有。所以代码不应该发出任何错误,对吧?但是我在 msvc++2008 专业版中遇到了重新声明错误。它在 gcc 上编译得很好。
错误的原因可能是什么?
对不起大家。在阅读了 cmets 并查看了我的原始代码之后,我发现我在输入第二个代码示例时犯了一个错误。 我错过了构造函数的定义和语句 a *object = new a;在构造函数内部。道歉。这意味着我的代码与其他用户发布的其他代码完全相同。但现在由于现有答案,我现在无法删除我的问题。
【问题讨论】:
-
对于它的价值,Visual C++ 2010 接受了第二个示例。我没有在这台笔记本电脑上安装 Visual C++ 2008,但如果它给出错误,我会冒险猜测这段代码,很可能是 Visual C++ 2010 中修复的错误。
-
见stackoverflow.com/questions/4274386/…其实身体几乎一模一样!
-
此问题与this one 完全相同。投票关闭。 @James:仅供参考,代码没有在 Comeau 上编译。
-
@Prasoon:Comeau 没有错误地接受第二个示例。它不接受第一个示例,这是可以接受的(我不记得是否需要拒绝第一个示例,或者仅当模板被实例化时才被拒绝就足够了。我必须看看。)
-
虽然代码可能相似,但我不认为它是完全重复的
标签: c++ templates scope friend