Не удалось вывести аргумент шаблона с помощью typedef? - PullRequest
0 голосов
/ 10 ноября 2018

Учитывая следующую пару классов:

template <typename T1, typename T2>
class A{ 
public:
    // ...
};

template<typename _T>
struct alias { typedef A<int,_T> intA; };

class B{
public:
    // ...
    template <typename _T> B& operator=(const typename alias<_T>::intA& _arg) { };
};

Когда я пытаюсь присвоить объект класса A<int,int> объекту класса B, я получаю следующую ошибку компиляции:

template argument deduction/substitution failed: couldn't deduce template parameter ‘_T’

Есть ли альтернативный способ использовать что-то типа typedef в качестве входного аргумента для B::operator=() ??

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Я получаю другую ошибку (при использовании g ++ 5.4): need ‘typename’ before ‘alias<_T>::intA’ because ‘alias<_T>’ is a dependent scope и достаточно верно следующие компиляции для меня:

template <typename T1, typename T2>
class A{ 
public:
    // ...
};

template<typename _T>
struct alias { typedef A<int,_T> intA; };

class B{
public:
    // ...
    template <typename _T> B& operator=(const typename alias<_T>::intA& _arg) { };
};

Я думаю, причина в том, что alias<_T>::intA - это не фактический тип, а шаблонное имя типа.

0 голосов
/ 10 ноября 2018

Проблема в том, что intA является зависимым именем. Шаблоны не могут быть выведены из зависимых имен. См. Например: Зависимые типы: сбой вывода аргумента шаблона .

Вам также не хватает ключевого слова typename.

Вы можете явно указать тип оператора:

template <typename T1, typename T2>
struct A{ };

template<typename _T>
struct alias { typedef A<int,_T> intA; };

struct B 
{
    template <typename T> B& operator=(const typename alias<T>::intA& _arg) { };
};

int main() 
{
    A<int,int> a;
    B b;
    b.operator=<int>(a);
    return 0;
}

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

template <typename T1, typename T2>
struct A{ };

template<class T>
using alias_int = A<int, T>;

struct alias
{
    template<class T>
    using intA = A<int, T>;
};

struct B 
{
    template <typename T> B& operator=(const alias_int<T>& _arg) { };
};

struct C
{
    template <typename T> C& operator=(const alias::intA<T>& _arg) { };
};

int main() 
{
    A<int,int> a;
    B b;
    C c;
    b = a;
    c = a;
    return 0;
}
0 голосов
/ 10 ноября 2018

шаблон using может решить проблему

template <typename T1, typename T2>
class A{ 
public:
    // ...
};

template<typename _T>
using alias = A<int,_T>;

class B{
public:
    // ...
    template <typename _T> B& operator=(const alias<_T>& ) { return *this; };
};

void f()
{
    B b;
    A<int, int> a;
    b = a;
}
...