【问题标题】:invalid use of incomplete type 'PGconn {aka struct pg_conn}'不完整类型'PGconn {aka struct pg_conn}'的无效使用
【发布时间】:2013-01-14 22:40:54
【问题描述】:

我有两个类,主类和连接类:

Conn.cpp:

#include "conn.h"
#include <postgresql/libpq-fe.h>

Conn::getConnection()
{
        connStr = "dbname=test user=postgres password=Home hostaddr=127.0.0.1 port=5432";
        PGconn* conn;
        conn = PQconnectdb(connStr);
        if(PQstatus(conn) != CONNECTION_OK)
              {
                cout << "Connection Failed.";
                PQfinish(conn);
              }
        else
              {
                cout << "Connection Successful.";
              }
        return conn;

}

conn.h

#ifndef CONN_H
#define CONN_H
#include <postgresql/libpq-fe.h>
class Conn
{
public:
    const char *connStr;
    Conn();
    PGconn getConnection();
    void closeConn(PGconn *);
};

Main.cpp

#include <iostream>
#include <postgresql/libpq-fe.h>
#include "conn.h"

using namespace std;

int main()
{
    PGconn *connection = NULL;
    Conn *connObj;
    connection = connObj->getConnection();

return 0;
}

错误:无效使用不完整类型 'PGconn {aka struct pg_conn}'

错误:'PGconn {aka struct pg_conn}'的前向声明

有什么帮助吗?

【问题讨论】:

  • 您的conn.cpp 看起来完全错误。你有嵌套在自身内部的Conn::getConnection() 的定义?
  • 是的,你是对的,但我说清楚了,错误没有改变。

标签: c++ c oop


【解决方案1】:

在您的conn.h 中,您应该将getConnection 定义为返回PGconn *,而不是PGconnPGconn 是一个不透明的类型(你的代码除了名字应该不知道它的任何信息),所以你不能返回它或按值使用它。

【讨论】:

    【解决方案2】:

    在您的 conn.cpp 中,conn::getConnection() 没有返回类型。从您的代码中,我猜您需要返回一个指向 PGconn 的指针:

    conn.h

    class Conn
    {
    public:
        const char *connStr;
        Conn();
        PGconn* getConnection();
              ^^ return pointer instead of return by value
        void closeConn(PGconn *);
    };
    

    conn.cpp

    PGconn* Conn::getConnection()
    ^^^^^^ // return PGconn pointer
    {
       connStr = "dbname=test user=postgres password=Home hostaddr=127.0.0.1 port=5432";
    
       PGconn* conn = NULL;
       conn = PQconnectdb(connStr);
       if(PQstatus(conn) != CONNECTION_OK)
       {
           cout << "Connection Failed.";
           PQfinish(conn);
       }
        else
        {
          cout << "Connection Successful.";
        }
        return conn;
    }
    

    【讨论】:

    • 非常感谢您的解释。
    【解决方案3】:

    行:

    PGconn getConnection();
    

    由于PGConn 是一个不完整的类型,你不能定义一个按值返回它的函数,只能返回一个指向它的指针。

    【讨论】:

    • 错了,你声明了一个不完整类型的返回或传值。问题在于方法的定义,而不是声明。
    • @LuchianGrigore 你必须支持它,因为我看不出如何调用复制 c'tor 进行前向声明。
    • 因为它只是一个声明,所以什么都没有调用。
    • @LuchianGrigore,很公平。
    • @LuchianGrigore,虽然我想指出声明也没有通过。所以你仍然不能按值传递一个不完整的类型:P
    猜你喜欢
    • 2017-05-11
    • 2021-05-24
    • 1970-01-01
    • 2013-04-05
    • 2018-06-25
    • 1970-01-01
    • 2019-11-25
    • 2014-01-28
    相关资源
    最近更新 更多