引用自定义库中的对象会产生错误:“不允许指向不完整类类型的指针”

时间:2019-01-25 19:36:23

标签: c++

因此,在我的Visual Studio解决方案中,我正在制作一个库,并且有两个Visual Studio项目,一个用于库,一个用于沙箱。在库中,我试图使用前向声明创建一个类。在此示例中,我只是在为类创建一个头文件,使用以下前向声明声明std :: string,并使用该类创建成员指针。

图书馆项目:

ClassFromLibrary.h

#pragma once

namespace std {
class string;
}

class ClassFromLibrary {
public:
ClassFromLibrary();
~ClassFromLibrary();

std::string* forwardDeclaredString;
};

ClassFromLibrary.cpp

#include "ClassFromLibrary.h"
#include <string>

ClassFromLibrary::ClassFromLibrary() 
: forwardDeclaredString(new std::string("Hello, world!"))
{
}

ClassFromLibrary::~ClassFromLibrary()
{
}

沙盒项目

main.cpp

#include <Library/ClassFromLibrary.h>
#include <iostream>

int main() 
{
    ClassFromLibrary test;
    std::cout << 
       *test.forwardDeclaredString //Root of the problem
                 << std::endl;
    std::cin.get();
}

问题

正如我之前所说,库项目可以完美地编译。但是,在沙箱项目的任何文件中引用前向声明的成员变量时,都会出现我在标题中提到的错误。我有一个较大的项目,遇到了同样的错误,我之所以要实现这一点,是因为我在自己的图书馆项目中使用了其他外部图书馆,并且当我用它创建应用程序时,我并不想把所有的东西都放进去。该库在项目属性中包含目录,而仅在我的库中包含一个目录。

谢谢!

1 个答案:

答案 0 :(得分:2)

您知道将名称放在colIndex中会使程序格式错误(某些情况除外?)?好吧,知道你知道为什么。您遇到的错误是行为未定义的症状。

在我的测试中,您在size中声明前向声明的方式与在grid标头中实际声明的方式不同。但是它是同一个名称,所以现在您遇到了名称冲突(只要包含namespace std,就包含std,这就会引起冲突。这就是我的编译器在尝试编译代码时告诉我的内容:

  

/opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0 /../../../../ include / c ++ / 8.2.0 /位/basic_string.h:6628:17:   错误:对“字符串”的引用不明确

string

这与您在问题中输入的错误不同,但是由于行为是不确定的,因此任何事情都可能发生。