J'ai une classe Configréférence définie à l'intérieur const int shared_ptr
// config.hpp
class Config {
public:
static constexpr int a = 1;
static constexpr int b = 1;
}
, parmi lesquels figurent main.cpp
// main.cpp
#include "config.hpp"
int main() {
std::cout << Config::a << std::endl; // this is ok
std::shared_ptr<otherClass> stream = std::make_shared<otherClass>(
Config::a); // compile error
}
et compilateur dit que undefined reference to Config::a
et cela fonctionne lors de l'utilisation cout
, mais ne fonctionne pas lorsque dans shared_ptr
constructeur.
Je ne sais pas pourquoi cela se produit.
Vous devez définir 'au champ d'a' espace de noms comme un membre statique avant C++ 17, par exemple' constexpr int Config :: a; '' Pourquoi –
cout' fonctionne? –
C'est une conséquence malheureuse de la transmission parfaite et de l'utilisation de l'odr qui fait que 'make_shared' ne fonctionne pas. 'make_shared (int (Config :: a))' fonctionnera également –