Preciso interagir com uma função С, mas esse código não compila.
// c_enum.h
#pragma once
typedef enum { val1 = 0 } c_style_enum_t;
c_style_enum_t c_func();
// my_class.hpp
#pragma once
extern "С" {
#include "c_enum.h"
}
class my_class {
public:
private:
friend c_style_enum_t ::c_func();
};
Gcc imprime um erro:
error: 'enum c_style_enum ' is not a class or namespace
142 | friend c_style_enum ::c_func();
error: ISO C++ forbids declaration of 'c_func' with no type [-fpermissive]
Quando o tipo de retorno de c_func() é int ou algum outro tipo diferente de enum, isso funciona
Como fazer isso funcionar?
Permitir que sua
friend
declaração de uma"C"
função no namespace global funcione enquanto a"C"
função coexiste com um potencialc_func
residente no mesmo namespace quemy_class
, esta pode ser uma opção:Demonstração
Observação: isso funciona mesmo sem a ambiguidade que o namespace
c_func
de amy_class
também traz.Usar o
::
operador sem um namespace precedente neste contexto não funciona devido ao nome que o precede. O espaço em branco entre eles colapsa, então é analisado assim:Neste caso, basta remover o operador:
Você se esqueceu de um dos princípios básicos da escrita de código..:) Para tornar expressões ou declarações mais legíveis e claras, use parênteses.:)
Por exemplo
Isso permite declarar a função como amiga mesmo que a classe
my_class
esteja definida em algum namespace diferente do namespace global e dentro desse namespace haja uma função com o mesmo nome e protótipo.Por exemplo
A
friend
declaração não deve incluir aenum
palavra-chave ou o operador de resolução de escopo. Em vez disso, você deve declarar diretamente a função como um amigo.c_enum.h
minha_classe.hpp
Remova o operador de resolução de escopo. O
::
operador não é necessário aquiEspero que isso corrija seus erros de compilação.
O problema aqui é que
c_style_enum_t
é um enum e não uma classe ou namespace, então você não pode usarc_style_enum_t::c_func()
sintaxe porquec_style_enum_t
não é um escopo. O erro ocorre porque afriend
declaração está incorreta.Solução
Declare
c_func()
como amigo corretamente, sem usarc_style_enum_t::
:Fixo
my_class.hpp