¿Cómo es que no puedo instanciar un objeto de tipo Foo con el constructor anterior?El constructor de plantillas C++ no compilará
Tengo una barra de clase que usa un typedef interno (como una solución para "template typedefs") y tengo la intención de usarlo en un constructor como el siguiente (CASE 1). Sin embargo, parece que no lo compilo. ¿Es esto legal C++? CASO 2 parece sugerir que el problema está relacionado con el typedef en Bar.
¿Cómo puedo definir un constructor que acepte std :: vectores de objetos con el tipo en Barra?
#include <vector>
#include <iostream>
#include <utility>
template <typename T>
struct Bar
{
typedef std::pair<T, T> type; // or anything else that uses T
};
struct Foo
{
Foo() {}
// CASE 1: doesn't compile
template <typename T> explicit Foo(const std::vector<typename Bar<T>::type>& data)
{
std::cout << "Hello\n";
}
//// CASE 2: compiles, but it's not what I want
//template <typename T> explicit Foo(const std::vector<Bar<T> >& data)
//{
// std::cout << "Hello\n";
//}
};
int main()
{
std::vector<Bar<int>::type> v; // for CASE 1
//std::vector<Bar<int> > v; // for CASE 2
Foo f(v);
return 0;
}
¿Se puede publicar el error de salida? –
VC++ confunde mi constructor con el constructor de copia y escribe: 'Foo :: Foo (const Foo Y)': no se puede convertir el parámetro 1 de 'std :: vector <_Ty>' a 'const Foo &' salidas del CCG: no hay función de coincidencia para la llamada a 'Foo :: Foo (std :: vector> &)' –
kmhofmann
El compilador Intel C++ da la siguiente advertencia útil en la línea con la declaración del constructor: advertencia # 488 : el parámetro de plantilla "' T' "no se utiliza para declarar los tipos de parámetros de la plantilla de función" 'Foo :: Foo (const std :: vector :: type, std :: allocator :: type >> &)' " –