简体   繁体   中英

GCC template argument deduction/substitution failed

The code below compiles on MSVC but fails on GCC (4.6.3). Why does it fail and what should I do to fix it?

#include <array>

class Foo {
public:
    template<typename T, int N>
    operator std::array<T, N>() const {
        return std::array<T, N>();
    }
};

int main(){
    Foo val;

    // both of the following lines fail on GCC with error:
    //    "no matching function call...", ultimately with a note:
    //    "template argument deduction/substitution failed"
    auto a = val.operator std::array<int, 2>();
    static_cast<std::array<int, 2>>(val);

    return 0;
}

EDIT: The following code, however, does compile (on both compilers), despite passing in an int for std::array 's template parameter.

template<int N, typename T>
struct Bar {
    std::array<T, N> buf;
};

int main()
{
    auto x = Bar<3, double>();
    return 0;
}

If you read the full text of the error messages you get, the compiler is complaining because the type for N in your template class is int , while the second parameter of std::array is std::size_t , which is an unsigned long on your system.

Changing your template's declaration to use std::size_t N will fix the problem.

MSVC is not complaining possibly because it recognizes that the value "2" works for either case, or because of a compiler bug.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM