niejawna instancja niezdefiniowanego szablonu „klasa”

Próbując zaoferować funkcje dla stałych i niekonstentnych argumentów szablonów w mojej bibliotece natknąłem się na dziwny problem. Następujący kod źródłowy jest minimalnym przykładowym zjawiskiem:

#include <iostream>


template<typename some_type>
struct some_meta_class;

template<>
struct some_meta_class<int>
{
    typedef void type;
};



template<typename some_type>
struct return_type
{
    typedef typename some_meta_class< some_type >::type test;

    typedef void type;
};



template<typename type>
typename return_type<type>::type foo( type & in )
{
    std::cout << "non-const" << std::endl;
}

template<typename type>
void foo( type const & in )
{
    std::cout << "const" << std::endl;
}


int main()
{
    int i;

    int const & ciref = i;
    foo(ciref);
}

Próbowałem zaimplementować wersję inną niż stała i wersję stałą dla foo, ale niestety ten kod nie zostanie skompilowany na CLANG 3.0 i gcc 4.6.3.

main.cpp: 18: 22: error: niejawna instancja niezdefiniowanego szablonu 'some_meta_class'

Z jakiegoś powodu kompilator chce użyć nieskonfigurowanej wersji foo dla stałego int-reference. To oczywiście prowadzi do błędu powyżej, ponieważ nie ma implementacji dla some_meta_class. Dziwne jest to, że jeśli wykonasz jedną z następujących zmian, kod dobrze się skompiluje i działa:

usuń komentarz / usuń wersję inną niż stałauncomemnt / usuń typedef z return_type :: test

Ten przykład jest oczywiście minimalistyczny i czysty. W mojej bibliotece natknąłem się na ten problem, ponieważ stała i niestała wersja zwraca różne typy. Zarządzałem tym problemem, używając klasy pomocniczej, która jest częściowo wyspecjalizowana.

Ale dlaczego powyższy przykład powoduje takie dziwne zachowanie? Dlaczego kompilator nie chce używać nieskonfigurowanej wersji, w której poprawna jest wersja stała i pasuje lepiej?

questionAnswers(1)

yourAnswerToTheQuestion