diff --git a/src/typeAdapter.cpp b/src/typeAdapter.cpp index 2170ed53..13651900 100644 --- a/src/typeAdapter.cpp +++ b/src/typeAdapter.cpp @@ -25,6 +25,8 @@ namespace vmime { +#if !defined(__GNUC__) || ((__GNUC__ >= 3) && (__GNUC_MINOR__ >= 3)) + template <> void typeAdapter ::parse(const string& buffer, const string::size_type position, const string::size_type end, string::size_type* newPosition) @@ -35,5 +37,7 @@ void typeAdapter ::parse(const string& buffer, const string::size_type p *newPosition = end; } +#endif // !defined(__GNUC__) || ((__GNUC__ >= 3) && (__GNUC_MINOR__ >= 3)) + } // vmime diff --git a/vmime/typeAdapter.hpp b/vmime/typeAdapter.hpp index 9d25f416..906f34a5 100644 --- a/vmime/typeAdapter.hpp +++ b/vmime/typeAdapter.hpp @@ -121,9 +121,30 @@ private: }; -template <> -void typeAdapter ::parse(const string& buffer, const string::size_type position, - const string::size_type end, string::size_type* newPosition); +#if defined(__GNUC__) && (__GNUC__ >= 3) && (__GNUC_MINOR__ <= 2) + + // Because of a bug with g++ <= 3.2, we have to put the implementation + // of the function inline. + + template <> + inline void typeAdapter ::parse + (const string& buffer, const string::size_type position, + const string::size_type end, string::size_type* newPosition) + { + m_value = string(buffer.begin() + position, buffer.begin() + end); + + if (newPosition) + *newPosition = end; + } + +#else + + template <> + void typeAdapter ::parse + (const string& buffer, const string::size_type position, + const string::size_type end, string::size_type* newPosition); + +#endif // defined(__GNUC__) && (__GNUC__ >= 3) && (__GNUC_MINOR__ <= 2) } // vmime