Ao usar libtorch, o seguinte snippet causa um erro:
#include <iostream>
#include <torch/torch.h>
using namespace torch;
int main() {
std::cout << zeros({}) << std::endl;
}
O compilador reclama:
% g++ -lc10 -ltorch -ltorch_cpu test.cpp -o test.x
test.cpp: In function ‘int main()’:
test.cpp:5:23: error: call of overloaded ‘zeros(<brace-enclosed initializer list>)’ is ambiguous
5 | std::cout << zeros({}) << std::endl;
| ~~~~~^~~~
In file included from /opt/links/include/ATen/Functions.h:1334,
from /opt/links/include/ATen/ExpandUtils.h:4,
from /opt/links/include/torch/csrc/autograd/input_metadata.h:3,
from /opt/links/include/torch/csrc/autograd/function.h:7,
from /opt/links/include/torch/csrc/autograd/custom_function.h:7,
from /opt/links/include/torch/csrc/api/include/torch/autograd.h:5,
from /opt/links/include/torch/csrc/api/include/torch/all.h:7,
from /opt/links/include/torch/csrc/api/include/torch/torch.h:3,
from test.cpp:2:
/opt/links/include/ATen/ops/zeros.h:35:19: note: candidate: ‘at::Tensor at::zeros(IntArrayRef, c10::TensorOptions)’
35 | inline at::Tensor zeros(at::IntArrayRef size, at::TensorOptions options={}) {
| ^~~~~
In file included from /opt/links/include/torch/csrc/api/include/torch/types.h:7,
from /opt/links/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,
from /opt/links/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,
from /opt/links/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:4,
from /opt/links/include/torch/csrc/api/include/torch/data/dataloader.h:3,
from /opt/links/include/torch/csrc/api/include/torch/data.h:3,
from /opt/links/include/torch/csrc/api/include/torch/all.h:9:
/opt/links/include/torch/csrc/autograd/generated/variable_factories.h:565:19: note: candidate: ‘at::Tensor torch::zeros(at::IntArrayRef, c10::TensorOptions)’
565 | inline at::Tensor zeros(at::IntArrayRef size, at::TensorOptions options = {}) {
| ^~~~~
Por que ele está at::zeros
incluído como candidato quando eu não estou using namespace at
?
Há muitas outras perguntas sobre erros como esse que acho que não respondem à minha pergunta:
- Erro: tentou definir uma função com e sem um parâmetro opcional/padrão
Não é relevante porque: ambas as variantes foram definidas no mesmo namespace
Perguntas: 1 2 - Erro: #include'd a variante C de um cabeçalho em vez da variante C++
Não é relevante porque: libtorch não tem uma interface C até onde eu sei
Perguntas: 1 2 - Erro: declarou a mesma função em dois namespaces diferentes (muito próximos!)
Não é relevante porque: ambos os namespaces foram incluídos no escopo, um por umusing
e um por estar naquele namespace agora, enquanto no meu caso um dos candidatos reivindicados não parece que deveria estar no escopo para mim
Perguntas: 1 2 - Erro: nenhuma das sobrecargas disponíveis tinha o tipo correto
Não é relevante porque: ambos os candidatos têm o mesmo tipo e correspondem à chamada; por exemplo, alterarzeros
paratorch::zeros
faz com que o arquivo seja compilado
Perguntas: 1 2 3
Há muitos, muitos outros; admito que fiquei frustrado nesse ponto e desisti de dar uma olhada.
Porque os cabeçalhos do pytorch contêm um
diretiva dentro do
torch
namespace. Veja aqui .Porque você usa
using namespace torch;
isso transitivamente também torna tudoat
disponível no escopo global.O comentário acima da linha vinculada indica que eles não consideraram o usuário usando
using namespace torch;
para fazer chamadas não qualificadas. Parece que eles esperam que o usuário faça chamadas qualificadas em vez disso. Como o comentário afirma, a pesquisa qualificada se comporta de forma diferente.