gpt4 book ai didi

c++ - 基类的未定义模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:35 24 4
gpt4 key购买 nike

我很确定我已经在 SO 的某处阅读了编译器无法处理这段代码的原因,但是,经过几个小时的搜索,我仍然找不到它。相关代码如下:

#include <iostream>

template <typename T>
class base
{
};

class derived : base<derived::myStruct>
{
public:
struct myStruct
{
};
};

int main ()
{
return 0;
}

问题是解析器首先尝试生成 base<derived::myStruct>解析前的特化 derived ,因此,我收到此错误:“错误 C2065:‘myStruct’:未声明的标识符”。作为一个愚蠢的把戏,我注意到如果我预先声明 struct myStruct;,VS2010 会停止提示。就在class derived之上.在我看来,myStruct应该绑定(bind)在derived里面这段代码应该抛出同样的错误:

#include <iostream>

template <typename T>
class base
{
};

struct myStruct;

class derived : base<derived::myStruct>
{
public:
struct myStruct
{
};
};

int main ()
{
return 0;
}

更新:gcc-4.5.1 能够throw the expected error , 所以,我猜上面是 VS2010 中的一个错误...

最佳答案

derived::myStruct 此时只是一个不完整的类型。你的第二个例子也不应该工作,不幸的是 MSVC 编译器接受了很多格式错误的模板代码。一种解决方法是使用中间类来确保类型完整:

template <typename T>
class base
{
};

class middle
{
public:
struct myStruct
{
};
};

class derived : public middle, base<middle::myStruct>
{
};

int main ()
{
return 0;
}

关于c++ - 基类的未定义模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13426219/

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