Domanda

So che la questione non è molto descrittivo ma non ho potuto frase migliore.

Sto cercando di compilare una libreria collegata statica che ha diversi oggetti, tutti gli oggetti contenere quanto segue:

#include foo.h

foo.h è qualcosa in queste righe:

#pragma once
template<class T>
class DataT{
    private:
        T m_v;
    public:
        DataT(T v) : m_v(v){}
};

typedef DataT<double> Data;

Ora, tutto funziona bene, ma se cambio datat di essere solo dei dati con doppia invece di T, mi metterò un avviso LNK4006 al momento per ogni collegamento obj affermando che il .ctor è già stato definito.

Modifica 1:

#pragma once

class Data{
    private:
        double m_v;
    public:
        Data(double v) : m_v(v){}
};

Modifica 2: Sto utilizzando MSVC7. Il .ctor è di fatto incluse in entrambi i casi, come in

...
public:
   Data(double v);

#include foo.inl
...
//foo.inl
Data::Data(double v): m_v(v) {}

Quello che sto cercando di realizzare, però, non è quello di avere quel compilato, ma come un colpo di testa l'utente può utilizzare.

È stato utile?

Soluzione

Non sono sicuro di quello che stai cercando di fare l'esempio per la modifica # 2, ma I pensare potrebbe essere utile se si è il seguente in foo.inl:

inline
Data::Data(double v): m_v(v) {}

Se il contenuto del foo.inl viene anche incluso in qualcosa in cui la parola inline non funziona o non dovrebbe essere, probabilmente si può utilizzare il preprocessore per gestire la differenza utilizzando una macro che si espande a nulla o inline a seconda dei casi.

Altri suggerimenti

Se si mette la definizione costruttore in foo.cpp invece di foo.h non verrà compilato separatamente in ogni unità di traduzione. Al momento una copia del costruttore viene compilato in ogni oggetto la contiene il foo.h includere.

L'altra possibile soluzione potrebbe essere quella di ottenere il compilatore inline costruttore. hai disattivato inlining nelle impostazioni del compilatore? Il costruttore sembra abbastanza facile da ottenere automaticamente inline.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top