LINUX.ORG.RU

[c++] кто тупит — я или g++? что скажут владельцы icc?


0

0
#include <iostream>

typedef unsigned int uint;

template<class D> struct Array { };

template<uint n, class D> struct Alias
{
    typedef Array<D> Arr;
};

template<uint n, class D> float scalar_product( Array<D>& x,  Alias< n, D > :: Arr& y ) { return 0; }

int main(int argc, char** argv)
{
    Array<uint> aa;
    std::cout << scalar_product(aa, aa) << '\n';
    return 0;
}

пробовал g++ 4.1.1 и 4.3.2

test2.cxx:12: error: ‘struct Alias<n, D>::Arr’ is not a type <--- это чо?

test2.cxx: In function ‘int main(int, char**)’:

test2.cxx:17: error: no matching function for call to ‘scalar_product(Array<unsigned int>&, Array<unsigned int>&)’ <--- а это понятное следствие

UPDATE: если вас путают разные uint-ы, то можно s/Array<uint>/Array<float>/

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

ха, я тоже так попробовал, но не тут-то было:

test2a.cxx: In function ‘int main(int, char**)’:

test2a.cxx:17: error: no matching function for call to ‘scalar_product(Array<unsigned int>&, Array<unsigned int>&)’

_____________________________________

и вопрос остается — ведь компилятор в состоянии определить сам, что это тип

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

> и вопрос остается — ведь компилятор в состоянии определить сам, что это тип

«scalar_product(aa, aa)» - а кто будет аргументы шаблона указывать?

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

вообще аргументы шаблона указывать не нужно, но в данном случае n действительно не определить

однако оригинальный у ж++ способ информировать об этом

www_linux_org_ru ★★★★★ ()

ICC 11.1

test.cpp(13): error: nontype «Alias<n, D>::Arr [with n=n, D=D]» is not a type name
template<uint n, class D> float scalar_product( Array<D>& x, Alias< n, D > :: Arr& y ) { return 0; }
^

test.cpp(13): remark #1418: external function definition with no prior declaration
template<uint n, class D> float scalar_product( Array<D>& x, Alias< n, D > :: Arr& y ) { return 0; }
^

test.cpp(18): error: no instance of function template «scalar_product» matches the argument list
argument types are: (Array<uint>, Array<uint>)
std::cout << scalar_product(aa, aa) << '\n';
^

compilation aborted for test.cpp (code 2)


Clang C++:

test.cpp:13:63: error: missing 'typename' prior to dependent type name 'Alias<n, D>::Arr'
template<uint n, class D> float scalar_product( Array<D>& x, Alias< n, D > :: Arr& y ) { return 0; }
^~~~~~~~~~~~~~~~~~~~
typename
test.cpp:18:18: error: no matching function for call to 'scalar_product'
std::cout << scalar_product(aa, aa) << '\n';
^~~~~~~~~~~~~~
test.cpp:13:33: note: candidate template ignored: couldn't infer template argument 'n'
template<uint n, class D> float scalar_product( Array<D>& x, Alias< n, D > :: Arr& y ) { return 0; }
^
3 diagnostics generated.

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

> вообще аргументы шаблона указывать не нужно

компилятор умный, но libastral у него не всегда срабатывает :)

однако оригинальный у ж++ способ информировать об этом


«error: no matching function for call to ‘scalar_product(Array<unsigned int>&, Array<unsigned int>&)’» - абсолютно верная ошибка, т.к. действительно подходящей функции нет, опять же не задача компилятора перебирать существующие функции и шаблоны, чтоб делать предположения, что же хотел сказать программист и в чем он ошибся

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

> Clang C++

у него самый вменяемый вывод, интересно

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

> абсолютно верная ошибка, т.к. действительно подходящей функции нет,

функция есть, например scalar_product<0,uint>, а вот что вместо 0 можно подставить что угодно — это да, ошибка

вообще она возникла из-за того, что я сильно обкромсал реальный код

ладно, пойду там разбираться, здесь вопрос решен

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

> test.cpp:13:63: error: missing 'typename' prior to dependent type name 'Alias<n, D>::Arr'

черт, надо поставить ради человеческих сообщений об ошибках

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

хотя все же интересно узнать, что icc скажет при наличии typename и без указания параметров шаблона в scalar_product(aa, aa)

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

test.cpp(13): remark #1418: external function definition with no prior declaration
template<uint n, class D> float scalar_product() { return 0; }
^

test.cpp(18): error: no instance of function template «scalar_product» matches the argument list
argument types are: (Array<uint>, Array<uint>)
std::cout << scalar_product(aa, aa) << '\n';
^

compilation aborted for test.cpp (code 2)

так ?

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

Угу. За это и держу его в системе. Использую для тестовых сборок.

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