我遇到的问题是Visual Studio 2017的Intellisense报告错误消息,但代码本身仍然编译并按预期运行(我认为)。结果,当我开始做更复杂的事情或者它只是一个Intellisense错误时,我不确定我是否以错误的方式做这件事并让自己失败。
我可以生成导致此错误的最简化版本的代码如下:
template <typename T>
class A
{
protected:
template <typename T>
class A1
{
protected:
typename T::container ct; // should be inherited by B1
A1(typename T::container& j) : ct(j) {}
};
public:
A() {}
};
class B : public A<B>
{
public:
struct container
{
int data;
container(const int x) : data(x) {}
};
B() {}
private:
class B1 : public A1<B>
{
B1(container& i) : A<B>::A1<B>(i) {} // error appears here
};
};
我收到的错误消息是:
“没有构造函数的实例”A :: A1 :: A1 [与T = B,T = B]“匹配参数列表。参数类型是:(B :: container)”
红色波浪形的确切位置可以在这里看到:https://prnt.sc/fyd258
我将这些类设置为这种方式的原因是因为,在我的实际代码中,我正在组合使用模板和继承来在基类中创建泛型方法,该方法可以调用继承类中的方法。此外,我需要以这种方式设计,以便派生类中定义的结构可以通过它继承的基类中的嵌套类自动成为派生类(B1)中嵌套类的成员变量( A1)。
我只是不明白为什么当代码本身仍在编译时,Intellisense会给我错误。 也许我只需稍微改变一下,或者我需要完全重新思考我的设计(我假设后者)。你怎么看?