Конкретная версия зависимости снимка от Maven

not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.

В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:

template
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo f; 

При чтении этой строки компилятор создаст новый класс (назовем его FooInt), что эквивалентно следующему:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.

Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.

// Foo.h
template 
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template 
void Foo::doSomething(T param)
{
    //implementation
}

Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.

Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:

// Foo.h

// no implementation
template  struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float

Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .

34
задан Wim Coenen 14 March 2011 в 12:42
поделиться

3 ответа

Да, можно. Можно использовать любую версию, которая есть в ваших репозиториях maven. Я столкнулся с некоторыми проблемами, когда прозрачные зависимости испортились с версией. Вот где пригодилась mvn dependency: tree .

3
ответ дан 27 November 2019 в 17:00
поделиться

AFAIK, SNAPSHOT всегда относится к последней сборке , и нет возможности полагаться на конкретная версия.

Чтобы обойти эту проблему, вы можете повторно опубликовать точную версию, от которой вы хотите зависеть, в своем собственном репозитории maven и назначить ей конкретную версию.

-4
ответ дан 27 November 2019 в 17:00
поделиться

Чтобы использовать конкретную версию моментального снимка зависимости, указанный артефакт должен быть установлен / развернут с уникальным номером версии моментального снимка. См. Элемент uniqueVersion в справочнике / репозитории POM . В этом случае вы можете ссылаться на него следующим образом:

...
<dependency>
<groupId>groupid</groupId>
<artifactId>artifact-id</artifactId>
<version>1.0.0-20090610.041042-5</version>
</dependency>
...

Серверы диспетчера репозитория Maven могут иметь дополнительные связанные функции, например, переопределение параметра uniqueVersion в pom.xml . Например, об этой функции см. Руководство пользователя Artifactory (кроме того, вы можете прочитать здесь некоторые аргументы против использования уникальных номеров версий моментальных снимков).

49
ответ дан 27 November 2019 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: