Проблема с C ++ шаблонами - PullRequest
       18

Проблема с C ++ шаблонами

0 голосов
/ 09 февраля 2010

Я новичок в шаблонах на С ++. я пробовал несколько небольших программ.

    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

Может, кто-нибудь скажет мне, в чем именно ошибка?

Ответы [ 5 ]

7 голосов
/ 09 февраля 2010

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

#include <iostream>
using namespace std;

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

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

Редактировать: У вас также может быть где-то using std::max. Тебе тоже нужно от этого избавиться.

1 голос
/ 09 февраля 2010

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

::max
std::max

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

1 голос
/ 09 февраля 2010

Код, который вы разместили, прекрасно компилируется, внутри "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 голосов
/ 09 февраля 2010

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

0 голосов
/ 09 февраля 2010

Это говорит о том, что два определения для

max<unsigned long>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...