ошибка переопределения типа при включении 2 заголовочных файлов - PullRequest
2 голосов
/ 24 января 2012

Я компилирую Mex-файл Matlab (используя VS2010 под Windows), и следующие 2 включают в себя:

#include <algorithm> // for std::copy
#include "mex.h"

дай мне ошибку компиляции:

1> d: \ svn \ trunk \ dev \ matlab \ extern \ include \ matrix.h (337): ошибка C2371: 'char16_t': переопределение; различные основные типы

Я пытался поместить его в пространство имен:

namespace Algo {    
    #include <algorithm>
}

Но затем я получаю тонны других ошибок компиляции, даже не используя ничего, определенного в <algorithm>, например:

Error   1   error C2039: 'set_terminate' : is not a member of '`global namespace''  C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception    192
Error   2   error C2873: 'set_terminate' : symbol cannot be used in a using-declaration C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception    192

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 24 января 2012

Размещение стандартного заголовка в пространстве имен не является хорошей идеей, даже если вы не используете там ни один из методов или классов, существует довольно большая вероятность, что другой заголовок может (например, mex.h) , Помещение пространства имен вокруг заголовка mex кажется менее вероятным для создания конфликта.

Также включение одного заголовка перед другим также может предотвратить такой конфликт. Некоторые заголовки учитывают, что некоторые символы уже могут быть определены до их переопределения (разработчик библиотеки действительно должен позаботиться об этом)

В некоторых случаях чтение заголовков может также дать вам хорошее представление о том, что происходит. Иногда это может быть так просто, как определение символа, который говорит заголовку пропустить переопределение.

...