2015-01-29 3 views
-3
//myheader.h 

namespace abc{ 
    int func(int x) { return 10 + x;} 
    inline int callfunc(int a){ return func(a); } 
} 


//global.h 

int func(int x){ return 10 + x; } 

В приведенном выше примере, когда код компилируется, и даже если встраиваемая функция не вызывается в любом месте, на данный момент, он возвращает ошибку разрешить неоднозначность для func(int x). Почему встроенная функция не принимает существующее определение, которое уже присутствует в namespace abc?встраиваемая функции не разрешение неоднозначности

+0

'inline' функции все еще компилируются, даже если не вызываются, поэтому *« даже если встраиваемая функция не вызывается в любом месте, на данный момент, он возвращает ошибку»* показывает ваше непонимание того, что' inline' ключевое слово. Эффект * гарантированного * заключается в том, чтобы подавить одно правило определения (ODR) для этой функции. Все другое поведение специфично для компилятора. Кроме того, код, представленный здесь, недостаточен для воспроизведения проблемы. ([Это работает для меня] (http://ideone.com/ATfldv).) – cdhowie

+0

Устранена ли ваша ошибка со спецификой, например {return abc :: func (a); } –

+0

Почему он не разрешает двусмысленность определения функции, которое уже присутствует в текущем пространстве имен. ? – Srikan

ответ

0
  1. Ваша ошибка не воспроизводится из опубликованного кода - эти заголовки без проблем компилируются при включении в один файл .cpp. Поэтому вы действительно должны публиковать свои .cpp-файлы. Это файлы .cpp, которые фактически скомпилированы, а не заголовки, поэтому без них мы не получаем всю картину.
  2. Вы должны были опубликовать фактическую ошибку, а не только ваше впечатление об этом. С вашим описанием мы даже не можем быть уверены, что это ошибка компилятора или ошибка компоновщика.

Тем не менее, я предложу несколько возможных решений для вашей проблемы.

  1. Попробуйте указать пространство имен в вызове к FUNC:

    inline int callfunc(int a){ return abc::func(a); }

  2. Вы действительно не должны определить, не встроенные функции в заголовке, вы получите ошибки компоновщика, если вы включите ваш заголовки в нескольких файлах .cpp.
    Значит, вы должны хранить определения в .cpp и только декларации в файлах .h, как будто это должно было быть.

Смежные вопросы