LINUX.ORG.RU

C++ и поиск имён.


0

0

http://cpp.sourceforge.net/?show=20989

g++-4.1.1 говорит на это :
g++  main.cc -o tmpl_stec 
main.cc: In member function ‘void ns::C::Set(T) [with T = X]’:
main.cc:42:   instantiated from here
main.cc:22: error: no matching function for call to ‘Do(X)’
main.cc:10: note: candidates are: void ns::Do(int)
main.cc:14: note:                 void ns::Do(double)
make: *** [tmpl_stec] Ошибка 1

Возможно ли по минимуму изменить определение Do(X),
чтобы всё заработало? (и какого оно не собирается?).
Очень не хочется запихивать class X в ns.
★★★

Ответ на: комментарий от sf

Проблему мжно решить переделыванием Do в шаблонную. А как-нибудь по-другому можно?

sf ★★★
() автор топика
Ответ на: комментарий от sf

#include <iostream>

class X
{
};

namespace ns
{
    class C
    {
    public:
        template <typename T>
        void Set (T t);
    };

    void Do(int x)
    {
        std::cout << "int\n";
    }

    void Do(double x)
    {
        std::cout << "double\n";
    }

    void Do (X t)
    {
        std::cout << "class X\n";
    }

    template <typename T>
    void C::Set (T t)  
    { 
        ns::Do( T() );
    }
    
}
 
using namespace ns;
 
int
main (int argc, char * argv[])
{ 
    C c;
    c.Set( int(1) );
    c.Set( double(1.0) );
    c.Set( X() ); 
    return 0;  
}

Вот так работает.

ptomaine
()
Ответ на: комментарий от ptomaine

так ясно но плохо :]. Первый ns {} - библиотечный, а второй в юзерском коде (т.е. так не влепишь).

sf ★★★
() автор топика
Ответ на: комментарий от sf

Думаю, вряд ли так получится без костылей. Потому что библиотека собирается до пользовательского кода => "g++ не может узнать заранее, для какого типа создавать версию функции" или что-то вроде того. Косяки в g++ c соблюдением стандарта.

ptomaine
()
Ответ на: комментарий от ptomaine

explicit void Do (int)
explicit void Do (double)
и т.д.

anonymous
()
Ответ на: комментарий от ptomaine

Тогда и в comeau косяки (куда я линки давал). Но мне всё больше кажется, что это MSVC++ слишком много всего компилировать умеет (и уже далеко не первый раз :]).

sf ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.