2010-02-09 3 views
0

Я новичок в шаблонах в C++. Я пытался использовать небольшие программы.Проблема с шаблонами C++

CPP [80]> cat 000001.cpp 000001.hpp 
#include <iostream> 
#include <string> 
#include "000001.hpp" 

int main() 
{ 
    int i = 42; 
    std::cout << "max(7,i): " << ::max(7,i) << std::endl; 

    double f1 = 3.4; 
    double f2 = -6.7; 
    std::cout << "max(f1,f2): " << ::max(f1,f2) << std::endl; 

    std::string s1 = "mathematics"; 
    std::string s2 = "math"; 
    std::cout << "max(s1,s2): " << ::max(s1,s2) << std::endl; 
} 

template <typename T> 
inline T const& max (T const& a, T const& b) 
{ 
     return a < b ? b : a; 
} 

, когда я скомпилировать эту программу:

я получаю ошибку ниже:

CPP [78]> /opt/aCC/bin/aCC -AA 000001.cpp 
Error (future) 229: "/opt/aCC/include_std/string.cc", line 164 # "Ambiguous overloaded function call; a 
    function match was not found that was strictly best for ALL arguments. Two functions that matched 
    best for some arguments (but not all) were "const unsigned long &max<unsigned long>(const unsigned 
    long &,const unsigned long &)" ["000001.hpp", line 2] and "const unsigned long &std::max<unsigned 
    long>(const unsigned long &,const unsigned long &)" ["/opt/aCC/include_std/algorithm", line 1762]." 
    Choosing "const unsigned long &max<unsigned long>(const unsigned long &,const unsigned long &)" 
    ["000001.hpp", line 2] for resolving ambiguity. 
      _C_data = _C_getRep (max (_RW::__rw_new_capacity (0, this), 
           ^^^ 
Warning:  1 future errors were detected and ignored. Add a '+p' option to detect and fix them before they become fatal errors in a future release. Behavior of this ill-formed program is not guaranteed to match that of a well-formed program 

Может nybody скажите, пожалуйста, что именно ошибка?

ответ

1

Код, который вы опубликовали, просто отлично, внутри «000001.hpp» должно быть что-то другое. Можете ли вы разместить содержимое этого файла?

Редактировать: Если вы делаете, так как avakar говорит, но проблема не устранена, это должно быть связано с некоторыми проблемами с вашим компилятором. Есть два очевидных обходные пути я могу думать: переименовывать max функцию к чему-то еще, или положить его в пространстве имен:

namespace Foo 
{ 
    template <typename T> 
    inline T const& max (T const& a, T const& b) 
    { 
     return a < b ? b : a; 
    } 
} 

int main() 
{ 
    int i = 42; 
    std::cout << "max(7,i): " << Foo::max(7,i) << std::endl; 

    double f1 = 3.4; 
    double f2 = -6.7; 
    std::cout << "max(f1,f2): " << Foo::max(f1,f2) << std::endl; 

    std::string s1 = "mathematics"; 
    std::string s2 = "math"; 
    std::cout << "max(s1,s2): " << Foo::max(s1,s2) << std::endl; 
} 
+0

это обход работы. , но я сохранил оператор разрешающей области в пределах max, чтобы он не вызывал std :: max.даже тогда, почему ошибка идет? – Vijay

+0

Причина такова, что описан авакар. Если верно, что ваш заголовок «000001.hpp» содержит только определение 'max', тогда проблема связана с вашим компилятором, который впрыскивает некоторые std-символы в глобальное пространство имен, когда это не должно. – Manuel

7

Вы, вероятно, в том числе <iostream.h> вместо <iostream> где-то. Бывший не существовало в течение некоторого времени, но по причинам совместимости, вы компилятор до сих пор принимает включают и заменяет его

#include <iostream> 
using namespace std; 

Это заставляет std::max быть приведены в глобальное пространство имен, что приводит к неоднозначности. Замените <iostream.h> на <iostream> или переименуйте функцию max, и проблема должна исчезнуть.

Редактировать: Вы, видимо, исправили включение, но я уверен, у вас все еще есть using namespace std;. Вам нужно избавиться от этого. На самом деле вы никогда не должны использовать using namespace в глобальном масштабе.

Редактировать: Возможно, у вас также есть using std::max. Тебе тоже нужно избавиться.

+0

Это не его проблема, код компилируется отлично, даже если вы добавляете 'using namespace std' (протестировано на VS2008 и GCC 4.1). – Manuel

+1

Нет, если вы также включаете , который определяет 'std :: max'. Если вы подробно прочтете отчет об ошибке, вы обнаружите, что у компилятора возникают проблемы с неопределенностью 'max', определенной в заголовке пользователя и' max', определенным в заголовке 'algorithm' (точно в строке 1762). –

+0

Тем не менее, это не должно быть ошибкой, не так ли? В стандарте не указано имя ':: max'. – MSalters

1

Я не знаю, какой компилятор вы используете, но вторая ошибка говорит вам, что две следующие функции сталкиваясь:

::max 
std::max 

Это кажется действительно странным, вы можете иметь using namespace std; где-то хуже, что один из ваших включений включает iostream.h, как указано в первой ошибке. Не могли бы вы дать больше информации о своем компиляторе/инструментальной цепочке и содержимом вашего файла .hpp?

0

Он говорит, что были найдены два определения для

max<unsigned long> 

. Одно определение находится в 000001.hpp, а другое - в/opt/aCC/include_std/algorithm. Компилятор теперь выбрал тот, который находится в 000001.hpp, поэтому в настоящее время ошибка отсутствует. Но в нем говорится, что эти два определения могут вызвать ошибки в будущем.

0

Я не знаю, вызвало ли это проблему, но так или иначе; вы не должны использовать имя max для своей глобальной (или локальной) функции, поскольку оно является частью STL.

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