Неопределенная ссылка на явно созданную функцию шаблона - PullRequest
0 голосов
/ 19 октября 2018

У меня есть класс с методом шаблона, который объявлен в заголовке и определен в файле cpp, поэтому

// A.h - declaration
struct A
{
    template<typename T = int> void fun();
};

, а затем

// A.cpp - definition
#include <iostream>
#include "A.h"

template<typename T> void A::fun()
{
    std::cout << "Hello world template" << std::endl;
}

// Explicit instantiation
template void A::fun<int>();

Теперь, где-то еще,в тесте у меня есть

#include "A.h"

int main ()
{
    A a;
    a.fun();
}

, и, поскольку я явно создал функцию для параметра шаблона int, все в порядке.Или должно быть!

Мой код прекрасно связывается с GCC 7.3.0, но не связывается с clang 6, который сообщает о неопределенной ссылке на функцию fun.

Что здесь происходит?Есть ли что-нибудь еще, что я должен заботиться?Возможно, что-то, что GCC считает само собой разумеющимся, а clang - нет?

Спасибо!

Редактировать

@ WhozCraig, @Neil Butterworth здесь ссылкикоманды для двух наборов инструментов.

GCC:

/usr/bin/g++  -g   CMakeFiles/test_generator.dir/generator/generator.cpp.o CMakeFiles/test_generator.dir/test_utils.cpp.o  -o test_generator -Wl,-rpath,/home/mleoni/PhD/ABI/libcellml/build/src:/home/mleoni/PhD/ABI/libcellml/build/tests/gtest ../src/libcellmld.so.0.1.0 gtest/libgtest_main.so /usr/lib/x86_64-linux-gnu/libxml2.so gtest/libgtest.so -lpthread

clang:

/usr/bin/clang++  -g   CMakeFiles/test_generator.dir/generator/generator.cpp.o CMakeFiles/test_generator.dir/test_utils.cpp.o  -o test_generator -Wl,-rpath,/home/mleoni/PhD/ABI/libcellml/build/src:/home/mleoni/PhD/ABI/libcellml/build/tests/gtest ../src/libcellmld.so.0.1.0 gtest/libgtest_main.so /usr/lib/x86_64-linux-gnu/libxml2.so gtest/libgtest.so -lpthread

@ IdeaHat: это не помогло решить проблему, к сожалению, я все еще получаюта же ошибка

Edit 2 Поскольку код, который я на самом деле пытаюсь скомпилировать, [очевидно] не тот, я попытался скомпилировать этот MWE, и GCC, и clang связывают его просто сcc A.cpp main.cpp.

Теперь я пытаюсь понять, в чем разница между этим минимальным регистром и кодом, который у меня есть на самом деле.

1 Ответ

0 голосов
/ 19 октября 2018

Я нашел это.Где-то в этой кодовой базе я не знаком со всеми классами, помеченными как приватные по умолчанию [как в Windows D:], и после того, как я отметил, что мой открытый класс clang может наконец правильно соединиться.

Теперь график утолщается, потому что сдвоичные файлы, скомпилированные clang. В наборе тестов я вижу много ошибок, которых нет при компиляции с GCC.

Кроме того, теперь у меня есть тот же вопрос, что и в этой теме, за исключением того, что теперь работают GCC и clang.хорошо, в то время как MSVC говорит unresolved external symbol: '(.

...