Veja também lista padrão C ++ e tipos construtíveis padrão
Não é um problema importante, apenas irritante, pois não quero que minha classe seja instanciada sem os argumentos específicos.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
Isso me dá o seguinte erro g ++:
/usr/include/c++/4.3/bits/stl_map.h:419: erro: nenhuma função correspondente para chamada para 'MyClass ()'
Isso compila bem se eu adicionar um construtor padrão; Tenho certeza de que não é causado por sintaxe incorreta.
c++
dictionary
Nick Bolton
fonte
fonte
Respostas:
Este problema vem com o operador []. Citação da documentação SGI:
Se você não tem um construtor padrão, pode usar as funções inserir / localizar. O exemplo a seguir funciona bem:
fonte
emplace
em C ++ 11 como uma alternativa concisa parainsert
.std::<map>::value_type
nainsert
chamada?= default
deve funcionar muito bem.Sim. Os valores em contêineres STL precisam manter a semântica de cópia. IOW, eles precisam se comportar como tipos primitivos (por exemplo, int) o que significa, entre outras coisas, eles devem ser construtíveis por padrão.Sem isso (e outros requisitos), seria desnecessariamente difícil implementar as várias operações internas de copiar / mover / trocar / comparar nas estruturas de dados com as quais os contêineres STL são implementados.Após referência ao padrão C ++, vejo que minha resposta não foi precisa. A construção padrão não é, de fato, um requisito :
De 20.1.4.1:
Então, estritamente falando, seu tipo de valor só precisa ser construtível padrão se você estiver usando uma função do contêiner que usa o construtor padrão em sua assinatura.
Os requisitos reais (23.1.3) de todos os valores armazenados em contêineres STL são
CopyConstructible
eAssignable
.Existem também outros requisitos específicos para contêineres específicos, como ser
Comparable
(por exemplo, para chaves em um mapa).A propósito, o seguinte é compilado sem erros no comeau :
Portanto, este pode ser um problema do g ++.
fonte
Verifique os requisitos do tipo armazenado do stl :: map. Muitas coleções de stl requerem que o tipo armazenado contenha algumas propriedades específicas (construtor padrão, construtor de cópia, etc.).
O construtor sem argumentos é necessário para o stl :: map, porque ele é usado quando o operador [] é chamado com a chave, que ainda não foi mantida pelo mapa. Neste caso, o operador [] insere a nova entrada que consiste na nova chave e valor construído usando o construtor sem parâmetros. E esse novo valor é então retornado.
fonte
Verifique se:
A declaração std :: map parece correta, eu acho.
fonte
Provavelmente porque std :: pair requer isso. std :: pair contém dois valores usando a semântica de valor, então você precisa ser capaz de instanciá-los sem parâmetros. Portanto, o código usa std :: pair em vários lugares para retornar os valores do mapa ao chamador e isso é normalmente feito instanciando um par vazio e atribuindo os valores a ele antes de retornar o par local.
Você poderia contornar isso com ponteiros inteligentes usando um mapa <int, smartptr <MyClass>>, mas isso adiciona a sobrecarga de verificação de ponteiros nulos.
fonte