Способ иметь отдельную реализацию выглядит следующим образом.
//inner_foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};
//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
//foo.h
#include <foo.tpp>
//main.cpp
#include <foo.h>
inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.
Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.
Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.
Набор TL/DR
Ваш Origin ID
в источнике в Вашем Распределении Cloudfront для совпадения с доменным именем Вы пытаетесь создать псевдоним для [1 112]
[еще 1120] Деталь
, я боролся с этим в течение некоторого времени.
В конце я сравнил рабочее распределение CloudFront, которое привело в порядок шоу в Маршруте 53 с тем, который не сделал.
то, Что я заметил, было то, что эти Origin Id
определенный в источнике для распределения был не доменное имя для моего сайта.
Эта опция найдена в: CloudFront Distributions
> [Id of distribution]
> Origins and Origin Groups
> Origins
.
я только возник перечисленный, где путь был именем общественности s3 блок. Эта запись также имела Origin ID
поле. Когда я обновил это, чтобы быть моим доменным именем (без www
префикс), например, testdomain.com
тогда я смог видеть, что это облачное переднее распределение в маршруте 53 искажает выпадающий.