2016-04-03 4 views
2
#include <stdio.h> 
#include <string> 
#include <chrono> 
#include <deque> 
#include <mutex> 
#include <iostream> 
#include <fstream> 
#include <thread> 
#include <atomic> 
#include <utility> 
#include <map> 

class session_elem; 
typedef std::map<std::string, session_elem> autosession; 
union session_elem_t{ 
    std::string s; 
    int64_t n; 
    char c; 
    std::function<void(autosession*)> f; 
    autosession r; 
}; 
class session_elem{ 
    enum type{ s, n, c, f, r }; 
    session_elem_t val; 
}; 
typedef std::map<std::string, session_elem> autosession; 

int main(int argc, char **argv) 
{ 
    printf("hello world\n"); 
    return 0; 
} 

このパズルの解決策はありますか?2つのヘッダーを使用する必要がありますか、それとも1つの方法を使用するのですか

注文によっては、前方宣言エラーが発生します。

私のコードをGCC 5.3でコンパイルするには、どのような宣言順序を使用しなければなりませんか?

これ以上は最小限に抑えることはできませんが、それでもコンパイルに失敗します。すべてが正しいと思われるので、なぜ前方宣言エラーがありますか?与えられた

エラーは、それがsession_elem_t*session_elem_tを変更することにより、session_elem PODを作ることによって働くメイド

/bin/sh -c '/usr/bin/make -j8 -e -f Makefile' 
----------Building project:[ ArchiUtils - Debug ]---------- 
make[1]: Entering directory '/home/archivist/Projets/zdd/ArchiUtils/ArchiUtils' 
codelite-cc /usr/bin/g++ -c "/home/archivist/Projets/zdd/ArchiUtils/ArchiUtils/main.cpp" -pedantic -std=c++14 -Wall -g -O0 -Wall -o ./Debug/main.cpp.o -I. -I. 
In file included from /usr/include/c++/5.3.1/bits/stl_algobase.h:64:0, 
       from /usr/include/c++/5.3.1/bits/char_traits.h:39, 
       from /usr/include/c++/5.3.1/ios:40, 
       from /usr/include/c++/5.3.1/ostream:38, 
       from /usr/include/c++/5.3.1/iostream:39, 
       from /home/archivist/Projets/zdd/ArchiUtils/ArchiUtils/main.cpp:1: 
/usr/include/c++/5.3.1/bits/stl_pair.h: In instantiation of 'struct std::pair<const std::__cxx11::basic_string<char>, ArchiUtils::v1::sv0::session_elem>': 
/usr/include/c++/5.3.1/functional:1981:45: required by substitution of 'template<class _Functor, class> std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = std::function<void(std::map<std::__cxx11::basic_string<char>, ArchiUtils::v1::sv0::session_elem>*)>; <template-parameter-1-2> = <missing>]' 
/home/archivist/Projets/zdd/ArchiUtils/ArchiUtils/ArchiUtils.hpp:1003:10: required from here 
/usr/include/c++/5.3.1/bits/stl_pair.h:102:11: error: 'std::pair<_T1, _T2>::second' has incomplete type 
     _T2 second;    /// @c second is a copy of the second object 
     ^
In file included from /home/archivist/Projets/zdd/ArchiUtils/ArchiUtils/main.cpp:2:0: 
/home/archivist/Projets/zdd/ArchiUtils/ArchiUtils/ArchiUtils.hpp:1003:10: note: forward declaration of 'class ArchiUtils::v1::sv0::session_elem' 
    class session_elem{ 
     ^
ArchiUtils.mk:95: recipe for target 'Debug/main.cpp.o' failed 
make[1]: *** [Debug/main.cpp.o] Error 1 
make[1]: Leaving directory '/home/archivist/Projets/zdd/ArchiUtils/ArchiUtils' 
Makefile:4: recipe for target 'All' failed 
make: *** [All] Error 2 
====4 errors, 3 warnings==== 
+0

コンパイルしたコードはGCC 5.3で正常にコンパイルされています。何が問題ですか? – Rufflewind

+0

それは私にエラーフォワード宣言を与える...私は更新を参照してください –

+0

またGCC 5.3で、上記のコードはエラーまたは警告なしでコンパイルすることを確認することができます-std = C++ 14 -Wall -Wextra - ペタニック取得している特定のエラーメッセージは何ですか?実際にこのコードに関連していない可能性がありますか? – acwaters

答えて

0
 class session_elem; 
     union session_elem_t; 
     enum session_elem_type{s,n,c,f,r}; 
     typedef std::map<std::string, session_elem> autosession; 
     union session_elem_t{ 
      std::string s; 
      int64_t n; 
      char c; 
      std::function<void(autosession*)> f; 
      std::map<std::string, session_elem> r; 
     }; 
     class session_elem{ 
      session_elem_type type; 
      session_elem_t* val; 
     }; 

です。

魔法を起こしました。それはの定義が必要ですので、あなたの元のコードに不具合がstd::function<void(autosession*)> f、 としてsession_elem_t::fの宣言から茎のよう

0

は:session_elemが定義されていない時点で

std::pair<const std::__cxx11::basic_string<char>, session_elem> 

を、それはあなたに、より便利かもしれません を ではなく、単に を関数ポインタとして定義するには、をに置き換えてください(利用可能なコードからはわかりませんが)。 これはコンパイルされます:

#include <map> 
#include <string> 
#include <functional> 

class session_elem; 
typedef std::map<std::string, session_elem> autosession; 
union session_elem_t{ 
    std::string s; 
    int64_t n; 
    char c; 
    void (*f)(autosession*); 
    autosession r; 
}; 
class session_elem{ 
    enum type{s,n,c,f,r}; 
    session_elem_t val; 
}; 
関連する問題