#include <iostream>
using namespace std;
template<typename T> void print(T&& mX)
{
std::cout << std::forward<T>(mX) << std::endl;
}
struct SomeStruct
{
static constexpr const char* someString{"hello!"};
SomeStruct()
{
print(someString);
}
};
int main()
{
SomeStruct s{};
return 0;
}
clang++ -std=c++1y ./code.cpp -o code.o
Linker ошибка (неопределенная ссылка) с `статической constexpr сопзИте полукокс *` и идеально-экспедиторской
/tmp/code-a049fe.o: In function `SomeStruct::SomeStruct()': ./code.cpp:(.text._ZN10SomeStructC2Ev[_ZN10SomeStructC2Ev]+0xa): undefined reference to `SomeStruct::someString' clang: error: linker command failed with exit code 1 (use -v to see invocation)
g++ -std=c++1y ./code.cpp -o code.o
/tmp/ccyrTsjS.o: In function `SomeStruct::SomeStruct()': code.cpp:(.text._ZN10SomeStructC2Ev[_ZN10SomeStructC5Ev]+0xd): undefined reference to `SomeStruct::someString' collect2: error: ld returned 1 exit status
Почему эта ошибка компоновщика происходит? Разве не someString
должен быть разрешен во время компиляции?
Кроме того, ошибка не происходит, если print(someString)
заменяется cout << someString;
Почему вы пересылаете значение cout? – Tafuri
Вы привязываете ссылку на 'someString', которая использует odr. Таким образом, его определение требуется. – 0x499602D2
@Tafuri: это всего лишь минимальный пример для воспроизведения более сложной проблемы в более крупном проекте. –