У меня есть класс с методом шаблона, который объявлен в заголовке и определен в файле 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
.
Теперь я пытаюсь понять, в чем разница между этим минимальным регистром и кодом, который у меня есть на самом деле.